Javascript for 循环 promise

标签 javascript promise

我有一组这样的 url

var urls = ["www.google.com", "www.yahoo.com"];

而且我想遍历 url 并在循环内执行异步任务,并且在异步任务完成之前不移动到下一个项目。我知道你可以用 promise 来做到这一点,但我遇到了一些麻烦。这是我拥有的

var xmlReader = require('cloud/xmlreader.js');

function readResponse_async(xlmString) {
    var promise = new Parse.Promise();
    xmlReader.read(xlmString, function (err, res) {
        if(err) {
            promise.reject(err);
        } else {
            promise.resolve(res);
        }
    });
    return promise;
}

for (i = 0; i < urls.length; i++) {

    Parse.Cloud.httpRequest({
        url: unionUrls[i],
    }).then(function(httpResponse) {
            try {
//              console.log(httpResponse.text)
                return readResponse_async(httpResponse.text)
            } catch (e) {console.log(e)}

}

但现在它不等待 readResponse_async 完成,我怎么能让它等待呢?

谢谢

编辑

阅读响应后,我保存到我的数据库,我有另一个这样的数组

var location = ['USA', 'England'];

我是这样保存的

function saveLoc_async(data, location) {
var i3, i4, i5, m,
            TestItem = Parse.Object.extend("TestItem"),//can be reused within the loops?
            promise = Parse.Promise.as();//resolved promise to start a long .then() chain
        for (i3 = 0; i3 < data.count(); i3++) {
             (function(testItem) {
                        testItem.set("item", data.at(i));
                        testItem.set("location", location);
                        //build the .then() chain
                        promise = promise.then(function() {
                            return testItem.save();
                        });
                    })(new TestItem());
//************************
//CALL  retry(); here?
//**************************

}

因为有你的回答我有

function retry() {
if (urlsUnion.length > 0) {
    var nextUrl = urlsUnion.pop();
    //********** ADDED LINE
    var nextLoc = location.pop();

    Parse.Cloud.httpRequest({
        url: nextUrl,
    }).then(function(httpResponse) {
        xmlReader.read(httpResponse.text, function (err, res) {
            if(err) {
                // show an error
            } else {
                //********** ADDED LINE
                saveLoc_async(res, nextLoc);
                retry();
            }
        });
    });
}
}

所以 retry(); 应该去哪里因为现在保存有时它会将第二个位置与第一个项目 url 之一放在一起?为什么会这样?

最佳答案

我为动画做了类似的事情。

var actions = [drawXXX, fadeOutYYY, drawXYZ];


this.startAnimation = function () {
    actions.reduce(function (previousAction, nextAction) {
        return previousAction.then(nextAction)
    }, $.when());
}

关于Javascript for 循环 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32701957/

相关文章:

javascript - 在 JavaScript 中将字符串转换为变量名

javascript - 无法使用javascript创建文本区域

javascript - 无法让 Nativescript 插件工作 "nativescript-admob"

javascript - 如何在 node.js 中同步函数和 promises

javascript - Javascript Promises - If 语句返回最佳实践

javascript - 使用 Promise.all

javascript - 如何知道异步 for 循环何时完成?

javascript - 如何在提交后使 php 表单只读并在同一页面上单击编辑可编辑?

node.js - node/express 中的 async/await 似乎不等待 Promise 解决

Javascript 如何判断监听器上是否发生了 event.preventDefault