문제

Essentially I have a ton of objects that I want to test the website on. I am using underscore to transform the URL into an array of promises for HTTP requests. As soon as one fails the chain is ending (I expected this). Is it possible for all the failures to be collected and returned to the Fail function? Or am I going to have to write this using allSettled and then parse that?

var Q = require('q')
var _ = require('underscore')
var JSON = require('JSON')
var FS = require("q-io/fs");
var HTTP = require("q-io/http");


FS.read('members.json').then(function(memberJson){
    return JSON.parse(memberJson)
}).then(function(memberObjects){
    var httpCheckPromises = _.
        chain(memberObjects).
        first(100).
        filter(function(member){
            return member.website.toLowerCase().indexOf('www') >= 0
        }).
        map(function(member){
            return HTTP.read(member.website)
        }).
        value()

    return Q.all(httpCheckPromises)
}).then(function(goodRequests){
    console.log(goodRequests)
}).fail(function(badRequests){
    console.log('bad')
    console.log(badRequests)
})
도움이 되었습니까?

해결책

Am I going to have to write this using allSettled and then parse that?

Yes, if you don't want to abort on the first failed request.

FS.read('members.json')
.then(JSON.parse)
.then(function(memberObjects){
    var httpCheckPromises = _.chain(memberObjects)
        .first(100)
        .pluck("website")
        .filter(function(website){
            return website.toLowerCase().indexOf('www') >= 0;
        })
        .map(HTTP.read)
        .value();
    return Q.allSettled(httpCheckPromises);
}).then(function(requests) {
    var goodRequests = _.chain(requests)
        .where({state:"fulfilled"})
        .pluck("value")
        .value(),
    badRequests = _.chain(requests)
        .where({state:"rejected"})
        .pluck("reason")
        .value();
    console.log("good:", goodRequests);
    console.log("bad:", badRequests);
});
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top