嵌套的 request,如何等待 request function 的完成?

viosey
  • 41

使用了下面的代码:

request(firstparams, function () {
    var secondparams = {
    // ******
    };

    request(secondparams, function () {
        for (i=0; i<3; i++) {
            var thirdparams = {
            // ******
            };

            request(thirdparams, function () {
                console.log('foo');
            });
        }
        console.log('bar');
    });
}); 

想要获得如下的结果:

foo
foo
foo
bar

但是结果却是:

bar
foo
foo
foo
回复
阅读 2.8k
3 个回答

Promise.all吧,可以等待多个请求都结束了使用then处理后面的行为
写个demo 适当改一下应该就可以了

// ajax函数 可以用request封装
var ajax = (url, type) => {
    return new Promise((resolve, reject) => {
        // 这块可以自己修改一下
        request({
            url,
            cb: function(data) {
                console.log('foo')
                resolve(data)
            }
        })
    })
}
// 生成promise要用的数组
var arr = []
for (i=0; i<3; i++) {
    arr.push(ajax('/xxx/xxx'))
}
// 执行 等到三次请求都结束后 打印出来bar 因为每次请求都打印foo
// 所以结果应该是foo foo foo bar
Promise.all(arr).then((value) => {
    console.log('bar')
})
request(secondparams, function () {
    var didSuccess = 0;
    for (i=0; i<3; i++) {
        var thirdparams = {
        // ******
        };

        request(thirdparams, function () {
            console.log('foo');
            if (didSuccess++ === 2) {
                callback();
            }
        });
    }
    function callback() {
        console.log('bar');
    }
});

你这么写 输出结果是正确的啊。 输出bar的语句虽然写在了最后,但是它是不等待上面的request执行完毕才执行的。

如果console.log('foo');不写在for的request里,才会输出

foo
foo
foo
bar

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏