2017-07-06 95 views
-2

我該如何在每一分鐘內派遣10個承諾?JavaScript - 每分鐘發送10個承諾?

我有這方面的動態日期列表中:

var dates = ["2016-08-31T23:00:00.000Z","2016-09-01T23:00:00.000Z","2016-09-02T23:00:00.000Z","2016-09-03T23:00:00.000Z","2016-09-04T23:00:00.000Z","2016-09-05T23:00:00.000Z","2016-09-06T23:00:00.000Z","2016-09-07T23:00:00.000Z","2016-09-08T23:00:00.000Z","2016-09-09T23:00:00.000Z","2016-09-10T23:00:00.000Z","2016-09-11T23:00:00.000Z","2016-09-12T23:00:00.000Z","2016-09-13T23:00:00.000Z","2016-09-14T23:00:00.000Z","2016-09-15T23:00:00.000Z","2016-09-16T23:00:00.000Z","2016-09-17T23:00:00.000Z","2016-09-18T23:00:00.000Z","2016-09-19T23:00:00.000Z","2016-09-20T23:00:00.000Z","2016-09-21T23:00:00.000Z","2016-09-22T23:00:00.000Z","2016-09-23T23:00:00.000Z","2016-09-24T23:00:00.000Z","2016-09-25T23:00:00.000Z","2016-09-26T23:00:00.000Z","2016-09-27T23:00:00.000Z","2016-09-28T23:00:00.000Z","2016-09-29T23:00:00.000Z","2016-09-30T23:00:00.000Z","2016-10-01T23:00:00.000Z"]; 

我想要得到的內容或結果與這些日期相關聯。但我不想一口氣拿到它們,但是每一分鐘都會有10件物品,直到日期不再。

這是我的工作代碼:

 var promises = dates.map(function (date, i) { 
     return getContent(date); 
    }); 

    Promise.all(promises).then((data) => { 
     console.log(data); 
    }).catch((err) => { 
     console.log(err.message); 
    }); 

它得到連續的內容,不正是我想要的。

但是有可能實現我所需要的嗎?有任何想法嗎?

注:

getContent(date)含有大量的async await諾言,這樣在promse.all調用它必須是一個promise嫌我猜,否則我可以在一個地方的所有返回數據(這是console.log(data); )當承諾結束時。

編輯:

const delayValue = (val, ms) => { 
    new Promise(resolve => { 
     setTimeout(resolve.bind(null, val), ms) 
    }); 
} 
+1

如果每分鐘的數據量真的很重要,我不會使用承諾。我將只使用'setInterval'並在所有數據消失後清除間隔。 – AtheistP3ace

+2

承諾不是隨着時間的推移而開展工作,它們是爲了在一些工作完成後處理某件事情。根據這項工作的結果,可能做些不同的事情。我會重新考慮你的代碼以及你實際想要達到的目標。即使下面的答案只是一個黑客,承諾做你想做的事情,他們不打算做。 – AtheistP3ace

+0

*「每分鐘每10個項目,直到日期不再」*:我不明白這句話。你能找出一個例子嗎? – trincot

回答

1

一個Promise只能解析一次,所以如果你需要每分鐘都有結果,想用promises做到這一點,你需要對每個數據塊都有一個單獨的承諾。

這裏是你如何能做到這一點通過反覆營造了一個承諾使用自定義delayValue功能:

const delayValue = (val, ms) => 
 
    new Promise(resolve => setTimeout(resolve.bind(null, val), ms)); 
 

 
async function loopDates(dates, chunk, delay) { 
 
    for (let i = 0; i < dates.length; i += chunk) { 
 
     console.log(await delayValue(dates.slice(i, i+chunk), i ? delay : 0)); 
 
    } 
 
} 
 

 
var dates = ["2016-08-31T23:00:00.000Z", "2016-09-01T23:00:00.000Z", "2016-09-02T23:00:00.000Z", "2016-09-03T23:00:00.000Z", "2016-09-04T23:00:00.000Z", "2016-09-05T23:00:00.000Z", "2016-09-06T23:00:00.000Z", "2016-09-07T23:00:00.000Z", "2016-09-08T23:00:00.000Z", "2016-09-09T23:00:00.000Z", "2016-09-10T23:00:00.000Z", "2016-09-11T23:00:00.000Z", "2016-09-12T23:00:00.000Z", "2016-09-13T23:00:00.000Z", "2016-09-14T23:00:00.000Z", "2016-09-15T23:00:00.000Z", "2016-09-16T23:00:00.000Z", "2016-09-17T23:00:00.000Z", "2016-09-18T23:00:00.000Z", "2016-09-19T23:00:00.000Z", "2016-09-20T23:00:00.000Z", "2016-09-21T23:00:00.000Z", "2016-09-22T23:00:00.000Z", "2016-09-23T23:00:00.000Z", "2016-09-24T23:00:00.000Z", "2016-09-25T23:00:00.000Z", "2016-09-26T23:00:00.000Z", "2016-09-27T23:00:00.000Z", "2016-09-28T23:00:00.000Z", "2016-09-29T23:00:00.000Z", "2016-09-30T23:00:00.000Z", "2016-10-01T23:00:00.000Z"]; 
 

 
loopDates(dates, 10, 2000);
.as-console-wrapper { max-height: 100% !important; top: 0; }

我們的getContent因素加進去,你會做map像你做了(雖然語法可以縮短),然後在每個塊上應用Promise.all

const delayValue = (val, ms) => 
 
    new Promise(resolve => setTimeout(resolve.bind(null, val), ms)); 
 

 
// Mock for getContent: 
 
const getContent = date => Promise.resolve(date); 
 
    
 
async function loopDates(dates, chunk, delay) { 
 
    const promises = dates.map(getContent); 
 
    
 
    for (let i = 0; i < dates.length; i += chunk) { 
 
     console.log(await delayValue(Promise.all(promises.slice(i, i+chunk)), 
 
            i ? delay : 0)); 
 
    } 
 
} 
 

 
var dates = ["2016-08-31T23:00:00.000Z", "2016-09-01T23:00:00.000Z", "2016-09-02T23:00:00.000Z", "2016-09-03T23:00:00.000Z", "2016-09-04T23:00:00.000Z", "2016-09-05T23:00:00.000Z", "2016-09-06T23:00:00.000Z", "2016-09-07T23:00:00.000Z", "2016-09-08T23:00:00.000Z", "2016-09-09T23:00:00.000Z", "2016-09-10T23:00:00.000Z", "2016-09-11T23:00:00.000Z", "2016-09-12T23:00:00.000Z", "2016-09-13T23:00:00.000Z", "2016-09-14T23:00:00.000Z", "2016-09-15T23:00:00.000Z", "2016-09-16T23:00:00.000Z", "2016-09-17T23:00:00.000Z", "2016-09-18T23:00:00.000Z", "2016-09-19T23:00:00.000Z", "2016-09-20T23:00:00.000Z", "2016-09-21T23:00:00.000Z", "2016-09-22T23:00:00.000Z", "2016-09-23T23:00:00.000Z", "2016-09-24T23:00:00.000Z", "2016-09-25T23:00:00.000Z", "2016-09-26T23:00:00.000Z", "2016-09-27T23:00:00.000Z", "2016-09-28T23:00:00.000Z", "2016-09-29T23:00:00.000Z", "2016-09-30T23:00:00.000Z", "2016-10-01T23:00:00.000Z"]; 
 

 
loopDates(dates, 10, 2000);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

感謝您的回答! – laukok

+0

對不起,我有這個'const delayValue =(val,ms)=> 新Promise(resolve => setTimeout(resolve.bind(null,val),ms));' - 爲什麼我不能有括號周圍?如果我這樣做,我會得到'undefined'。看到我上面的編輯。謝謝。 – laukok

+1

箭頭函數有兩種語法:我使用表達式語法,其中表達式是返回的值。如果添加*大括號*,則轉到語句塊語法:在這種情況下,您必須在表達式之前使用'return'。 – trincot

1

如果您使用的承諾,然後堅持,創建了一套超時解析器的承諾。

裏面彈出數組,並做任何你喜歡的。承諾所有這些承諾都可以做到我想的。

但爲什麼承諾,而不是一個簡單的循環與設置超時?

+0

'getContent(date)'包含大量的'async await'承諾。所以在這一點上,我認爲它也必須是一個承諾。但它似乎不可能大塊。 – laukok