簡體   English   中英

Node.js:Promise對象無法解析

[英]Nodejs: Promise object not resolving

我有以下代碼。 查看帶有注釋的兩行,其中未輸出任何內容。 我不明白為什么resolve()init()函數不會導致執行then()this.load()函數。

module.exports = function(url, list){
    var phantom     = require('phantom');
    var Blacklist   = require('../../lib/util/http/blacklist');

    var blacklist = new Blacklist( list );

    this.load = function(){
        console.log('phantom-page:load', url);
        return new Promise(function(resolve, reject){
            init()
                .then(function(page){
                    console.page('open:', url); // This doesn't output
                    page.open(url)
                        .then(function(status){
                            console.log('opened:', url);
                            resolve( page, status );
                        })
                    ;
                })
            ;
        });
    };

    function init(){
        console.log('phantom-page:init', url);
        return new Promise(function(resolve, reject){
            phantom.create()
                .then(function(instance){
                    console.log('phantom-page: page created');
                    return instance.createPage();
                })
                .then(function(page){
                    block( page );
                    resolve( page );
                    console.log( resolve ); // This outputs [Function]
                });
            ;   
        });

    }

    function block(page){
        console.log('phantom-page:block:rawRegExp', blacklist.rawRegExp);
        page.on('onResourceRequested', true, function(requestData, request, raw) {
            var url = requestData['url'];
            console.log('phantom-page:block:resource', url);
            var regRaw = '(/' + raw + '/gi).test("' + url + '")';
            var isBlacklisted = eval(regRaw);
            if (isBlacklisted) {
                console.log('phantom-page:block:abort', url);
                request.abort();
            }
        }, blacklist.rawRegExp);
    }

};

您幾乎可以肯定會在block()收到異常,並應添加一個.catch()

    .then(function(page){
        block( page );
        resolve( page );
        console.log( resolve ); // This outputs [Function]
    }).catch(function(e) { console.log(e) });

您的問題似乎不是關於為什么此方法不起作用,而是為什么您的console.log()會觸發並輸出[Function] ,而您的調用者卻無法解析,即使您只是CALLED resolve()

這是因為您在這里有一個諾言鏈。 console.log()將在當前“刻度”中立即執行。 但是resolve()不是-幾乎(取決於您使用的Promise庫)總是轉到下一個刻度。 這為異常觸發了足夠的時間。

除了.catch() (所有.catch()鏈都應包括)之外,還有.catch()可以幫助您:

process.on('uncaughtException', function(exception) {
    console.log('uncaughtException', 'error', { message: exception.message, stack: exception.stack });
});

process.on('unhandledRejection', function(reason) {
    console.log('unhandledRejection', 'error', reason);
});

將它們放在腳本開頭。 無論出了什么問題,無論出了什么問題,如果您不困住它,都將有一個巨大的謎團需要解開(就像您在這里所做的那樣)。 當您忘記處理錯誤情況時,這兩個陷阱可以幫助您進行跟蹤,並且可以為您節省數小時的調試和調試工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM