簡體   English   中英

使用帶有 REPL 的應用程序時如何解決承諾

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

更新:Node.js 現在默認執行此操作並解析 promise


舊答案:

您無法正確解析它們 - 但您可以提取它們對全局范圍的引用:

> 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.

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