我有一个这样的代码..我想获取一些内容,然后加载后,做一些事情。 所以我使用Promise.all并稍后访问已解析的值。但它正在给予价值,但像Promise {'这里的内容'}。 (见console.log ..) 我将使用正则表达式提取它,但后来我检查它的类型不是字符串,但对象没有键?为什么?
var request=require('request');
var urls=['someurl','someurl2','someurl3'];
var contents=[];
urls.forEach(function (u) {
contents.push(getContent(u) );
});
Promise.all(contents)
.then(function () {
// All should be loaded by now?
// Promises which are resolved are fulfiled, and values can be accessed later right?
contents.forEach(function (promise) {
var content = Promise.resolve(promise);
console.log(content); // Promise {'test'} ??
console.log(typeof content,Object.keys(content));
// object [] ???
});
}).
catch(function(err) {
//handle error here
});
function getContent(url) {
return new Promise ( function (resolve,reject) {
/** commented and stripped out for testing
request(url, function (err,response, data) {
if(err) {
reject(Error(err));
}
}); **/
resolve("test");
});
}
答案 0 :(得分:4)
contents
仍然只有承诺
你永远不能直接提取承诺的价值;你只能从then()
回调消费它。
相反,Promise.all()
会为结果数组返回一个承诺 。
更改您的then()
调用,将该数组作为回调参数并直接使用。
答案 1 :(得分:1)
首先,您以错误的方式访问结果:
Promise.all(contents).then( function(data) {
// data holds an array with the return values of the promises
console.log(data);
});
第二件事:你没有正确地创建一个Promise,实质上,你永远不会在你的getContent()
函数中解析它们,所以你永远不会得到你想要的数据!
function getContent(url) {
return new Promise ( function (resolve,reject) {
request(url, function (err,response, data) {
if(err) {
// reject the promise in case of error
reject(Error(err));
} else {
// resolve the promise with the output you need
resolve(data);
}
});
当您致电resolve()
时,承诺将得到解决,您传递的输入将被传递。
当您在Promise.all()
中指定的所有承诺得到解决后,将执行回调,您将能够访问使用resolve()
返回的数据。