2016-07-07 60 views
-2

我有一種情況,我存儲了一個包裹在承諾中的操作數組。現在,每次請求命中API時,它都會執行此操作。如何在藍鳥中實現履行承諾

比方說,我創建了一堆的操作來獲取運行服務的狀態:

const jobs = []; 

function statusRequest (url) { 
    return new Promise((resolve, reject) { 
    request(url, function(error, resp, body) { 
     if (error) { 
     return reject(error); 
     } 
     resolve(body); 
    }); 
    }); 
} 

services.forEach(url => { 
    jobs.push(statusRequest(url)); 
}); 

function handler (request, reply) { 
    Promise.all(jobs).then(results => { 
    // handle results 
    }) 
    .catch(error => reply(error).code(500)) 
} 

module.exports = { 
'auth'  : false, 
'description' : 'Get the status of all the services', 
'tags'  : [ 'api', 'system', 'status' ], 

    handler 
}; 

當請求達到API處理器爲它取的地位,並將其設置履約價值於第一時間結果(緩存)。向API取得成功請求將返回第一個履行價值。

有沒有辦法重置未實現的承諾,以便每次調用只執行已創建的操作?

+1

1. No. 2.這是一個明顯的XY問題:解釋你正在做的事,而不是你如何去做,並顯示你的代碼不能做你想做的事。 – Amit

+0

讓我們將您從DDD詢問的內容翻譯成英文。 「每次我想要發生什麼事情時,我都不想工作,但我希望發生這種事情。」操作是對正在完成的工作的隱喻。 「承諾」的履行是該作品的「完成」。 – Aron

+0

雖然它在技術上是可能的(JS中任何可能的東西)。這是可能做到的最糟糕的主意。因爲它不符合邏輯,語法或設計意義。我向你保證,下一個開發人員將處理你的代碼「他會找你,他會找到你的,他會殺了你的」。 – Aron

回答

-1

有沒有辦法重置對未實現的承諾,因此每個調用 只需執行已創建的操作?

不,你不能這樣做。

要訪問現有承諾的結果,您不需要實現它(這是您無法完成的任務)。你可以添加一個新的.then()處理程序。

這聽起來像你可以緩存原來的承諾,並使用新的.then()處理程序。這將只返回以前的結果。這是執行異步結果緩存的簡單方法。

var doSomeAPICall = (function() { 
    var cachedPromise; 

    return function() { 
     if (!cachedPromise) { 
      cachedPromise = doSomeAsyncOperation(); 
     } 
     return cachedPromise; 
    } 
})(); 

而且,樣品用量:

doSomeAPICall().then(function(data) { 
    // process data here 
}); 

// the second time, it will be using a cached result 
doSomeAPICall().then(function(data) { 
    // process data here 
}); 

記住,你可以隨時添加更多.then()處理程序,以現有的承諾,可以訪問的結果將有或已有。


僅供參考,您不能履行諾言。承諾是故意的一次性裝置,一旦滿足或拒絕,就會鎖定其狀態。您可以向其添加新的.then()處理程序以訪問承諾的結果,或者如果您要執行新的異步操作,則可以創建新的承諾。您不重複使用現有的承諾來執行另一個異步操作。他們明確地被設計防止那。


如果這是不是你正在嘗試做的,那麼請澄清你的問題更多一些,所以我們可以更清楚地瞭解你想要達到的目標。

+0

爲什麼downvote?這似乎回答了OP想要實現的目標。 – jfriend00

+0

@James - 這有助於回答你的問題嗎? – jfriend00