【问题标题】:Promise array for Q.allQ.all 的 Promise 数组
【发布时间】:2015-11-20 11:12:52
【问题描述】:

我有一个链接数组,我在第一个请求中得到了这些链接。我的目标是去每个环节收集数据。所以我想为每个请求做出一个承诺,将它们全部推送到一个数组中,然后传递给 Q.all 来解决所有的承诺。问题是我无法返回承诺并转到下一个链接 这是函数,我尝试发出多个请求并收集数据

function arrayPromise(linksArr){

function collectingData(elem){
    var deferredNew = Q.defer();
    var url = elem;
    request(url, function(error,response,html){
        if(error){
            deferredNew.reject(error);
        }
        var $ = cheerio.load(html);
        var title, content;

        $('.entry-title').filter(function(){
            var data = $(this);
            var title = data.text();
            items.text.push(
                {  titleof: title }
            )
        })

        $('.entry-content ').filter(function(){
            var data = $(this);
            var content = data.html();
            items.text.push(
                { contentof: content})
        })
        deferredNew.resolve(items);
    })
    console.log("Returning the promise");
    return defferedNew.promise;
}

var promiseArr;
console.log("LENGTH:");
console.log(linksArr.length);

for (var i = 0; i < linksArr.length; i++) {

    console.log(linksArr[i]);

    var tempPromise = collectingData(linksArr[i]);
    console.log(tempPromise);
    promiseArr.push(tempPromise);

};
    return promiseArr;
}

以及我如何尝试使用它

var linksPromise = fetchLinks();
linksPromise.then(function(arr){
    console.log("LINKS PROMISE RESOLVED");

    Q.all(arrayPromise(arr)).then(function(data){
        console.log("SUCCESS RESOLVING ALL PROMISES")
        console.log(data);
    },function(err){
        console.log("ERROR RESOLVING ALL PROMISES", err);
    });
},function(err){
    console.log(err);
})

【问题讨论】:

  • 然后传递给 Q.all 来解决所有的承诺 - 我想你误解了Q.all 的功能。它不会解析传入的 Promise,它会在传入数组中的所有 Promise 解析时解析,或者当其中任何一个 Promise 拒绝时拒绝
  • 我明白这一点。我认为错误可能不在 Q.all 中,而是在生成承诺数组的函数中

标签: arrays angularjs request q angular-promise


【解决方案1】:

promiseArr 应该声明为一个数组:

var promiseArr = [];

如果这不能解决问题,请提供您可能看到的错误。

【讨论】:

  • 这是一个很好的观点,但没有任何改变。我没有看到任何错误。好像for循环里面的函数永远不会返回。
  • 你能说得更具体点吗?您是否正在触发控制台日志?
  • 不,它没有。看起来脚本卡在 for 循环内的函数中
  • 注释掉你的请求函数。同时请粘贴您的请求函数。
  • 也请控制台日志 arr,你传入。
【解决方案2】:

有多个问题
首先是在

 deferredNew.resolve(items);

items 是在一个本地范围内定义的,而不是在评估 deferredNew.resolve(items); 的范围内的任何地方定义的。

另一个:将空数组分配给 promiseArr 也会有所帮助。

还有一个:request(url, function(error,response,html) 没有在任何地方分配结果,并且您的函数没有 return 语句,您认为您返回 promice deferredNew.resolve(items);

PS 还有更多的错误,检查你所有的函数返回值,例如$('..').filter(...) 没有返回值

【讨论】:

    猜你喜欢
    • 2017-11-23
    • 2023-03-05
    • 1970-01-01
    • 2017-08-04
    • 1970-01-01
    • 1970-01-01
    • 2016-04-12
    • 1970-01-01
    • 2017-12-08
    相关资源
    最近更新 更多