我有一个 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/