簡體   English   中英

如何將以下JavaScript Promise轉換為常規的異步代碼?

[英]How can I convert the following JavaScript Promise into regular asychronous code?

嗨,我正在使用以下代碼片段:

imaps.connect(config).then(function (connection) {

connection.openBox('INBOX').then(function () {

    // Fetch emails from the last 24h
    var delay = 24 * 3600 * 1000;
    var yesterday = new Date();
    yesterday.setTime(Date.now() - delay);
    yesterday = yesterday.toISOString();
    var searchCriteria = ['UNSEEN', ['SINCE', yesterday]];
    var fetchOptions = { bodies: ['HEADER.FIELDS (FROM TO SUBJECT DATE)'], struct: true };

    // retrieve only the headers of the messages
    return connection.search(searchCriteria, fetchOptions);
}).then(function (messages) {

    var attachments = [];

    messages.forEach(function (message) {
        var parts = imaps.getParts(message.attributes.struct);
        attachments = attachments.concat(parts.filter(function (part) {
            return part.disposition && part.disposition.type.toUpperCase() === 'ATTACHMENT';
        }).map(function (part) {
            // retrieve the attachments only of the messages with attachments
            return connection.getPartData(message, part)
                .then(function (partData) {
                    return {
                        filename: part.disposition.params.filename,
                        data: partData
                    };
                });
        }));
    });

    return Promise.all(attachments);
}).then(function (attachments) {
    console.log(attachments);
    // =>
    //    [ { filename: 'cats.jpg', data: Buffer() },
    //      { filename: 'pay-stub.pdf', data: Buffer() } ]
});

我正在嘗試刪除Promises,然后使用回調將代碼轉換為代碼。

目前,我正在瀏覽所有附件,當我在控制台上打印單個附件時,我得到:

Promise { <pending> }

如何將代碼轉換為常規回調代碼,以便可以訪問附件的“文件名”和“數據”屬性?

實際上,我不明白為什么您需要從承諾返回到回調,但是您可以使用以下代碼。 它只是一個承諾轉換器:

const promiseToCallback = function (promise) {
    if (!isFn(promise.then)) {
        throw new TypeError('Expected a promise');
    }

    return function (cb) {
        promise.then(function (data) {
            setImmediate(cb, null, data);
        }, function (err) {
            setImmediate(cb, err);
        });
    };
};

使用它

promiseToCallback(promise)(function(err, data) {
    ...
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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