與發電機的非同步流量

生成器是能夠暫停然後恢復執行的功能。這允許使用外部庫(主要是 q 或 co)模擬非同步函式。基本上它允許編寫等待非同步結果的函式,以便繼續:

function someAsyncResult() {
    return Promise.resolve('newValue')
}

q.spawn(function * () {
    var result = yield someAsyncResult()
    console.log(result) // 'newValue'
})

這允許編寫非同步程式碼,就好像它是同步的一樣。此外,嘗試捕獲幾個非同步塊的工作。如果承諾被拒絕,則錯誤將被下一個 catch 捕獲:

function asyncError() {
    return new Promise(function (resolve, reject) {
        setTimeout(function () {
            reject(new Error('Something went wrong'))
        }, 100)
    })
}

q.spawn(function * () {
    try {
        var result = yield asyncError()
    } catch (e) {
        console.error(e) // Something went wrong
    }
})

使用 co 將完全相同但使用 co(function * (){...}) 而不是 q.spawn