[英]How to resolve promises when using app with REPL
我有一個基本的 Node 網絡服務器(Koa.js + ORM)。 我喜歡從REPL開始,這意味着我可以像 CLI 工具一樣使用我的應用程序。
我所有的查詢都返回 Promises,但我不知道如何在 REPL 中解決它們。 我該如何解決?
例如下面的代碼(fetch() 查詢數據庫並返回一個promise)只給出這個輸出Promise {_bitField: 4325376, _fulfillmentHandler0: undefined, _rejectionHandler0: undefined …}
Transaction.where('reference', '1').fetch().then((res) => return res)
舊答案:
您無法正確解析它們 - 但您可以提取它們對全局范圍的引用:
> Transaction.where('reference', '1').fetch().then((res) => out = res)
[Object Promise]
> out
/* your data outputted here since the global was assigned to*/
將來我們可能會在 Node 中的 REPL 中允許await
,這將更干凈地解決問題。
如果不等待承諾履行,僅設置全局返回值可能(並且經常會)顯示錯誤的結果。
為確保用戶履行承諾,您可以向repl
服務器提供您自己的評估器:
// sample-repl.js
const repl=require('repl');
function replEvalPromise(cmd,ctx,filename,cb) {
let result=eval(cmd);
if (result instanceof Promise) {
return result
.then(response=>cb(null,response));
}
return cb(null, result);
}
repl.start({ prompt: 'promise-aware> ', eval: replEvalPromise });
這種 REPL 僅在承諾得到解決后才將控制權返回給用戶:
$ node sample-repl.js
promise-aware> new Promise(resolve=>setTimeout(()=>resolve('Finished!'),5000));
'Finished!'
promise-aware> out = new Promise(resolve=>setTimeout(()=>resolve('Finished!'),5000));
'Finished!'
promise-aware> out
'Finished!'
promise-aware>
請注意,因為它使用解析值設置了正確的全局返回變量。
標准節點 REPL 的工作方式如下:
> out = new Promise(resolve=>setTimeout(()=>resolve('Finished!'),5000));
Promise { <pending> }
> out
Promise { <pending> }
> out
Promise { <pending> }
> out
Promise { <pending> }
> out
Promise { 'Finished!' }
>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.