javascript - 在向前迭代之前等待调用函数完成

标签 javascript jquery angularjs

对于我必须编写的代码,我有点困惑。 目前我正在尝试遍历字符串数组。找到某个文本后,如果某个值为 true,则将该值绑定(bind)到临时Object.img。之后,必须对服务器进行调用,以便检索某些信息并将其绑定(bind)到同一个临时对象作为第二个属性 (temporaryObject.url)。不幸的是,调用可能在迭代完成后得到解析,因为它没有添加此调用将 url 添加到对象中的服务器。我使用的库是 angularjs 和 jquery。

这是我编写的部分代码。

$scope.Data = [];
var strArray = ["img1", "link", "img2", "link2", "img3", "link3"];
var re1 = /<img/;
for(var i = 0 ; i < strArray.length ; i++) {
    var tempObject = {};
    var test = re1.test(strArray[i]);
    if (test){
    tempObject.img = strArray[i + 1];
    myAngularService.getServerInformation().then(function(result){
        tempObject.url = result;
        $scope.Data.push(tempObject);
    }
   }

不幸的是,来自服务器的信息不会在迭代完成的同时到达,或者出现问题,因为 $scope.Data 不会包含从服务器请求的 url。任何有关如何使用此类代码的 promise 的建议将不胜感激。我尝试搜索所有可能的解决方案,但没有成功。

最佳答案

Javascript 是函数范围的。换句话说:

if (true) {
    var testing = 5;
}
console.log(testing); // Logs 5

将此应用到您的示例中,您的 .then 回调函数中的 tempObject 都引用相同的变量!

一种解决方案是在 for 语句中使用立即调用函数表达式 (IIFE) 来创建新作用域:

for(var i = 0 ; i < strArray.length ; i++) {
    (function() {
        var tempObject = {}; // Is now declared within the new function
        /* ... code here ... */
    })();
}

另一个解决方案是简单地使用 $.each (或angular.forEach):

$.each(strArray, function(index, value) {
    var tempObject = {}; // Is now declared within the new function
    /* ... code here ... */
}); 

关于等待所有调用完成,一种解决方案是将您的 promise 存储在数组中,使用 Angular 的 $q服务:

$scope.Data = [];
var promises = [];
var strArray = ["img1", "link", "img2", "link2", "img3", "link3"];
var re1 = /img/;
$.each(strArray, function (index, value) {
    var tempObject = {};
    var test = re1.test(value);
    if (test) {
        tempObject.img = strArray[index + 1];

        var myPromise = myAngularService.getServerInformation();

        myPromise.then(function (result) {
            tempObject.url = result;
            $scope.Data.push(tempObject);
        }

        promises.push(myPromise);
    }
})

$q.all(promises).then(function() {
    // All calls will have finished
    console.log($scope.Data); 
}, function() {
    // At least 1 call failed!
    console.log("an error occurred!");
});

关于javascript - 在向前迭代之前等待调用函数完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33419753/

相关文章:

javascript - Protractor :每次描述后打开新的网络驱动程序?

jquery - jQuery 中的简单模式

javascript - Angular 方法(常量、配置、运行、工厂、服务),调用它们的顺序重要吗?

javascript - Angular 1.2 Iframe ng-src 不更新 pdf

javascript - CSS 表格 - 鼠标悬停在 3 个表格中时的颜色效果

javascript - 如何让 Controller 等待AngularJS中的工厂响应?

javascript - 初学者 JavaScript OOP 与函数式

javascript - 选项[options.length] 不起作用

javascript - 重复 HTTP 请求,直到返回 404 错误

javascript - 使用 jQuery 在类的每个实例上添加随机 CSS