javascript - promise 无序

标签 javascript node.js express promise

我有一个 promise 嵌套在另一个 promise 中,如下所示:

 adb.screencap(list, id).then(function(missing) {
     adb.getScreens(list, id).then(function () {
         res.render('screencap', {output: "Screens captured."})
     })
 })

adb.screencap 和 adb.getScreens 的位置:

adb.screencap = function(list, id){
    return new Promise(function (resolve, reject) {
        var array = new Array();
        var promises = new Array();

        for (var i = 0; i < list.length; i++) {
            var cmd = "adb -s " + list[i] + " shell screencap /sdcard/" + list[i] + "-" + id + ".png";
            var missing = new Array();

            console.log("== " + cmd);
            promises.push(adb.openArray(i, array, list, cmd, missing));
        }
        Promise.all(promises).then(function (missing) {
            console.log(("resolve"));
            resolve(missing);
        })
    })
}
adb.getScreens = function(list, id){
    return new Promise(function (resolve, reject){
        for (var i = 0; i < list.length; i++) {
            var cmd = 'adb -s ' + list[i] + ' pull /sdcard/' + list[i] + "-" + id + ".png /home/IdeaProjects/DeviceServer/public/files/" + list[i] + "-" + id + ".png";
            exec(cmd, function (err, stdout, stderr) {
                console.log(stdout);
                console.log(cmd);
            });
        }
        resolve();
    })
}

是否有任何原因导致 adb.getScreens promise 在 adb.screencap promise 之前完成?

最佳答案

我仍在试图找出问题所在,因为这种情况的发生似乎很奇怪。 它可能位于 openArray() 方法或 exec() 函数内的某个位置。

就其值(value)而言,您可以简化一些事情,正如 Felix 建议的那样:

// If the getScreens handler doesn't need the 'missing' returned from screencap
adb.screencap(list, id).then(function(missing) {
    return adb.getScreens(list, id);
}).then(function ( gottenScreens ) {
    res.render('screencap', {output: "Screens captured."})
});

// You can just return the Promise.all here instead of adding another promise
// just to resolve the outer one.
adb.screencap = function(list, id) {
    var array = new Array();
    var promises = new Array();
    for (var i = 0; i < list.length; i++) {
        var cmd = "adb -s " + list[i] + " shell screencap /sdcard/" + list[i] + "-" + id + ".png";
        var missing = new Array();

        console.log("== " + cmd);
        // is this some async operation or are you just creating all the commands here?
        // if so, it does't make sense to use a promise here.
        promises.push(adb.openArray(i, array, list, cmd, missing));
    }       
    return Promise.all(promises);
}

关于javascript - promise 无序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42254463/

相关文章:

javascript - 如何在 fullCalendar 中隐藏事件?

javascript - 在 JavaScript 中使用递归将数组元素移动到不同位置

javascript - "npm install [package]"不更新 package.json

node.js - Express中中间件功能的正确使用方法

javascript - 虽然函数陷入循环,但循环的一半似乎没有执行

javascript - 带有参数的 Typeorm 监听器

node.js - 与elasticsearch连接的node.js客户端中的Econn重置和堆内存空间不足

node.js - Google Node Js 上的操作获取设备位置

node.js - 当 GET 路径不存在时,如何自动返回 404?

javascript - 允许在脚本运行完成后单击链接