[英]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.