循环角度的承诺混淆

Mad*_*gan 1 javascript asynchronous promise angularjs

我理解在简单场景中使用promises但是当前在使用for循环和对本地sqlite数据库进行一些更新时如何实现某些东西时确实很困惑.

代码如下

surveyDataLayer.getSurveysToUpload().then(function(surveys) {
  var q = $q.defer();

  for (var item in surveys) {
    var survey = surveys[item];

    // created as a closure so i can pass in the current item due to async process
    (function(survey) {
      ajaxserviceAPI.postSurvey(survey).then(function(response) {
        //from response update local database
        surveyDataLayer.setLocalSurveyServerId(survey, response.result).then(function() {
          q.resolve; // resolve promise - tried only doing this when last record also
        })
    });
    })(survey) //pass in current survey used to pass in item into closure


  }

  return q.promise;

}).then(function() {
  alert('Done'); // This never gets run
});
Run Code Online (Sandbox Code Playgroud)

任何帮助或协助将不胜感激.我可能正在努力研究如何最好地在循环内执行异步调用,这会进行另一次异步调用以进行更新,然后在完成后继续.

至少承诺让我摆脱了回调地狱.

干杯

Jar*_*a X 5

这个答案将让你在JS会议上得到答案(虽然没有保证)

surveyDataLayer.getSurveysToUpload().then(function(surveys) {
    return Promise.all(Object.keys(surveys).map(function(key) {
        var survey = surveys[key];
        return ajaxserviceAPI.postSurvey(survey).then(function(response){
            return surveyDataLayer.setLocalSurveyServerId(survey, response.result);
        });
    }));
}).then(function() {
    alert('Done');
});
Run Code Online (Sandbox Code Playgroud)