Javascript Q承诺链存在错误后的承诺链

Javascript Q承诺链存在错误后的承诺链,javascript,node.js,azure,q,Javascript,Node.js,Azure,Q,我有一个node.js脚本,可以打开Azure容器,在将页面流式传输到Azure容器的同时,在多个不同的国家拍摄页面截图。我遇到的问题是,如果我在流媒体处理过程中遇到错误,它会完成给定id的剩余屏幕截图,然后退出承诺链 因此,如果我在Id211006处遇到错误,它将完成所有屏幕截图,然后退出流。它不会继续下去 我对承诺如何工作以及它们如何捕获错误非常陌生,但我的理解是,如果,比如说,211006确实遇到错误,脚本将完成承诺链,然后在运行.fin之前向我显示任何错误-事实并非如此 有人能帮忙吗 A

我有一个node.js脚本,可以打开Azure容器,在将页面流式传输到Azure容器的同时,在多个不同的国家拍摄页面截图。我遇到的问题是,如果我在流媒体处理过程中遇到错误,它会完成给定id的剩余屏幕截图,然后退出承诺链

因此,如果我在Id
211006
处遇到错误,它将完成所有屏幕截图,然后退出流。它不会继续下去

我对承诺如何工作以及它们如何捕获错误非常陌生,但我的理解是,如果,比如说,
211006
确实遇到错误,脚本将完成承诺链,然后在运行
.fin
之前向我显示任何错误-事实并非如此

有人能帮忙吗

AzureService.createContainer()
    .then(function () {
        return ScreenshotService.getAllCountriesOfId('308572');
    })
    .then(function () {
        return ScreenshotService.getAllCountriesOfId('211006');
    })
    .then(function () {
        return ScreenshotService.getAllCountriesOfId('131408');
    })
    .then(function () {
        return ScreenshotService.getAllCountriesOfId('131409');
    })
    .then(function () {
        return ScreenshotService.getAllCountriesOfId('789927');
    })
    .then(function () {
        return ScreenshotService.getAllCountriesOfId('211007');
    })
    .then(function () {
        return ScreenshotService.getAllCountriesOfId('833116');
    })

    // Upload Log file into Azure storage
    .fin(function () {
        AzureService.init({
            container: config.azure.storage.msft.CONTAINER.LOG,
            account: config.azure.storage.msft.ACCOUNT,
            key: config.azure.storage.msft.ACCESS_KEY,
            file: config.file.log,
            isLogFile: true
        });

        log.info('Utility: Uploading log file [ %s ] to Azure storage container [ %s ]', AzureService.file, AzureService.container);

        return AzureService.uploadLocalFileToStorage()
            .then(function () {
                return util.deleteFile({fileName: AzureService.file, isLogFile: true});
            })
            .fail(function (err) {
                log.info(err);
            })
            .done();
    })

    .fail(function (err) {
        log.info(err);
    })

    .done();

只要允许错误返回到承诺链中,承诺链就会停止。它将承诺状态设置为已拒绝,并将在任何后续
.then()
处理程序中调用下一个错误处理程序,而不是已完成的处理程序

如果希望链继续,则需要捕获错误。捕获错误将导致承诺基础设施认为它被“处理”,并且承诺状态将再次得到满足,并且它将继续执行满足的处理程序。 承诺错误类似于例外情况。如果未处理它们,它们将中止处理,直到第一个异常处理程序。如果使用异常处理程序处理它们,则在该异常处理程序之后,处理将正常继续

在您的特定情况下,如果希望chaing继续,则需要处理以下每种类型的行中的错误:

return ScreenshotService.getAllCountriesOfId('308572');
您可以这样做:

return ScreenshotService.getAllCountriesOfId('308572').then(null, function(err) {
    console.log(err);
    // error is now handled and processing will continue
});
由于您有很多重复的代码,您可能应该将代码更改为在国家ID数组中迭代的代码,而不是反复复制代码行


下面是一种使用
.reduce()
将所有承诺连成一个循环的方法,它可以消除大量重复的代码,并处理各个国家/地区的错误,从而继续连成一个循环:

var countryIds = ['308572', '211006', '131408', '131409', '789927', '211007', '833116'];
countryIds.reduce(function(p, item) {
    return p.then(function() {
        return ScreenshotService.getAllCountriesOfId(item).then(null, function(err) {
            console.log(err);
        });
    });
}, AzureService.createContainer())
// Upload Log file into Azure storage
.fin(function () {
   ... rest of your code continued here