實例與程式碼片段

Delay(延時)

function delay(ms) {
  ms = Number(ms)
  ms = Number.isNaN(ms) ? +0 : Math.max(ms, +0)

  return new Promise(resolve => setTimeout(resolve, ms))
}

出自Writing Promise-Using Specifications

如果要讓delay可以有回傳值,可以用以下的範例:

function delay(ms) {
  return function(result) {
    return new Promise(function(resolve, reject) {
      setTimeout(function() {
        resolve(result)
      }, ms)
    })
  }
}

//使用範例
delay(1000)('hello').then(function(result) {
  console.log(result)
})

出自Fun with promises in JavaScript

包裝 XMLHttpRequest(AJAX)

出自Fun with promises in JavaScript

包裝 jQuery 的$.ajax

出自Fun with promises in JavaScript

forEach/for/while

在 forEach/for/while 等情況時,應該要使用Promise.all,因為它最後可以直接回傳一個陣列值,這提供了一些使用上的便利。

以下的的原本的使用範例,是希望能刪除所有的文件再到下一步:

正確用法

使用Promise.all,並以map取代forEach

出自We have a problem with promises

呼叫函式將回傳結果轉成 Promise 物件

說明如下:

  • 當呼叫函式回傳一個值v時,會回傳一個以v實現的 promise 物件。

  • 當呼叫函式會 throw 出例外e時,會回傳一個以e拒絕一個 promise 物件。

出自Writing Promise-Using Specifications

改寫回調函式

基本上這是為了改用回調地獄用的方式,把原本的回調函式程式碼:

另一個改寫的對照簡單範例:

出自Staying Sane With Asynchronous Programming: Promises and Generators

Last updated

Was this helpful?