使用Promise.all返回整体结果并将其传递给另一个函数

时间:2017-03-07 14:58:47

标签: javascript promise

此处有进一步的问题:Promise.all(): Return a result after all Promises are resolved and/or rejected

我正在使用Promise.all迭代:

// var env_array = ["env1", "env2", "env3", "env4"];

Promise.all(env_array.map(function(env) {
    return device_get_env(env).then(function(data) {
        var connected = data.data.connected;
        console.log(env, connected);
    });
}).then(function(data) {
    console.log(data);
}));

我有4种不同的环境。我正在所有这四种环境中搜索设备。有些可能会返回404,有些会返回200,有些会返回属性connect = true,有些则为false。

基本上我想在连接= true时触发某些功能,但如果环境连接为假,我只会显示某些环境中的信息,当然我是否会返回非404。

因此我认为我可能会收集所有结果,然后根据结果触发我的功能,而不是在迭代后立即触发功能。

你能建议,我应该走哪条路?谢谢。

UPD :我试过这个:

Promise.all(env_array.map(function(env) {
    return device_get_env(env);
}).then(function(data) {
    console.log(data);
}));

它抛出:

TypeError: env_array.map(function(env) {
        return device_get_env(env);
    }).then is not a function. (In 'env_array.map(function(env) {
        return device_get_env(env);
    }).then(function(data) {
        console.log(data);
    })', 'env_array.map(function(env) {
        return device_get_env(env);
    }).then' is undefined)

UPD1 ,出于某种原因。然后阻止不执行,因为我在控制台中看不到111:

Promise.all(env_array.map(function(env) {
    return device_get_env(env);
})).then(function(data) {
    console.log(111);
});

UPD2 :对于我的情况,我拒绝了一个或多个承诺,并且Promise.all被拒绝。

2 个答案:

答案 0 :(得分:1)

您需要使用Promises.all的响应数组,如下所示:

// var env_array = ["env1", "env2", "env3", "env4"];


Promise.all(env_array.map(function(env) {
    return device_get_env(env);
}) // Promise.all["PromiseEnv1", "PromiseEnv2", "PromiseEnv3", "PromiseEnv4"]
.then(function(data) {
    console.log(data); // ["404", {connected: true}, {connected: false}, "404"];
    // Now you can can process above array as you need.
}));

答案 1 :(得分:1)

您对一个括号的位置有疑问:

Promise.all(env_array.map(function(env) {
  ...
}).then(function(data) {
  ...
})); // <- Move this up

应该是:

Promise.all(env_array.map(function(env) {
  ...
})).then(function(data) { // <- here
  ...
});