链接来自foreach循环的承诺

时间:2016-03-27 07:52:32

标签: javascript arrays angularjs

如何在AngularJS中使foreach循环同步

var articles = arg;

articles.forEach(function(data){
      var promises = [fetchImg(data), fetchUser(data)];

      $q.all(promises).then(function (res) {
           finalData.push(res[1]);
      });
});

return finalData;

我想在finalData循环结束后才返回forEach数组。有没有办法用承诺链接它?什么会先执行foreach循环,然后在循环结束后返回数组?

2 个答案:

答案 0 :(得分:3)

您可以像这样修改代码:

function fetArticles(arg) {
    var articles = arg;
    var promises = [], finalData = [];
    var deferred = $q.defer();

    articles.forEach(function(data) {
          var userPromise = fetchUser(data);
          userPromise.then(function (res) {
               finalData.push(res[1]);
          });

          promises.push(fetchImg(data));
          promises.push(userPrommise);
    });

    $q.all(promises).then(function() {
         deferred.resolve({finalData: finalData, foo: "bar"});
    });

    return deferred.promise;
}

现在,调用此方法并注册最终回调:

fetArticles(arg).then(function(data) {
     console.log("finalData: ", data.finalData, data.foo === "bar");
});

答案 1 :(得分:3)

来自foreach循环的链接承诺

链接 返回值(或承诺)到.then方法中的处理函数。使用$q.all合并多个承诺,function fetchUsers(arg) { var articles = arg; var promises = articles.map(function(a){ var subPromises = [fetchImg(a), fetchUser(a)]; return $q.all(subPromises).then(function (res) { //return for chaining return {img: res[0], user: res[1]}; }); }); //consolidate promises var finalPromise = $q.all(promises); return finalPromise; }; 本身会返回可链接承诺。

.then

因为调用promise的.then方法会返回一个新的派生promise,所以很容易创建一个promise链。可以创建任意长度的链,并且由于可以使用另一个承诺(将进一步推迟其解析)来解决承诺,因此可以在链中的任何点暂停/推迟承诺的解析。 { {3}}

返回的承诺将解决使用一组用户的问题,或者在第一个错误时解决被拒绝的问题。使用承诺的.catch fetchUsers(args) .then ( function onFulfilled(objArray) { $scope.users = objArray.map(x => x.user); return objArray; }).catch ( function onRejected(response) { console.log("ERROR: ", response); throw response }) ; 方法检索最终解决方案。

$q.defer

$q.defer()反模式

使用from yapsy.PluginManager import PluginManager manager = PluginManager() manager.setPluginPlaces(["plugins"]) manager.collectPlugins() for plugin in manager.getAllPlugins(): plugin.plugin_object.print_name() 的问题在于它会破坏promise链,丢失错误信息,并且在错误处理不当时可能会造成内存泄漏。有关详细信息,请参阅1