【问题标题】:Return only innermost promise's catch and handle others只返回最里面的 promise 的 catch 并处理其他的
【发布时间】:2017-03-18 17:00:30
【问题描述】:

我有以下场景:

savePicture(newPicture, fileData){
    return compressionUtil.makePictureAndThumbnail(newPicture).then((data) => {
        let writeBig = fsUtil.writeFileToDisk(pictureFileName, data[0])
        let writeSmall = fsUtil.writeFileToDisk(thumbnailFileName, data[1])

        return Promise.all([writeBig, writeSmall]).then(() => {
            let picToSave = {
                uploaderUsername: fileData.username,
                directory: fileDirectory,
                fileName: fileName,
                tags: fileData.tags,
                description: fileData.description,
                droneTaken: fileData.droneTaken,
                isGenuine: isGenuine,
                metadata: metadata
            }
            return Picture.create(picToSave)
        })
    })
}

我要做的是像这样处理compressionUtil.makePictureAndThumbnail()Promise.all([writeBig, writeSmall]) 可能的承诺拒绝

savePicture(newPicture, fileData){
    return compressionUtil.makePictureAndThumbnail(newPicture).then((data) => {
        let writeBig = fsUtil.writeFileToDisk(pictureFileName, data[0])
        let writeSmall = fsUtil.writeFileToDisk(thumbnailFileName, data[1])

        return Promise.all([writeBig, writeSmall]).then(() => {
            let picToSave = {
                uploaderUsername: fileData.username,
                directory: fileDirectory,
                fileName: fileName,
                tags: fileData.tags,
                description: fileData.description,
                droneTaken: fileData.droneTaken,
                isGenuine: isGenuine,
                metadata: metadata
            }
            return Picture.create(picToSave)
        }).catch((err)=>{/*Handle promise.all error here*/})
    }).catch((err)=>{/*Handle makePictureAndThumbnail error here*/})
}

但同时让 savePicture() 只返回 Picture.create() 的承诺 .then() 和 .catch()。

我的想法是将它全部包装在一个巨大的 new Promise((resolve,reject)=>{}) 中,但这可能是一种糟糕的做法。

对此表示赞赏。谢谢。

【问题讨论】:

标签: javascript promise es6-promise


【解决方案1】:

将所有内容包装在一个巨大的 new Promise((resolve,reject)=>{}) 中可能是一种糟糕的做法。

是的indeed it is

要仅处理来自 Promise 而不是 then 实现回调的拒绝,您可以 use .then(…, …) instead of .then(…).catch(…)

savePicture(newPicture, fileData){
    return compressionUtil.makePictureAndThumbnail(newPicture).then((data) => {
        …
        return …
    }, err => {
//   ^ no `catch`
        /* Handle makePictureAndThumbnail error here */
    });
}

同样,

return Promise.all([writeBig, writeSmall]).then(() => {
    let picToSave = { … }
    return Picture.create(picToSave);
}).catch(err => {
    /* Handle all errors from writeBig, writeSmall and create */
});

return Promise.all([writeBig, writeSmall]).then(() => {
    let picToSave = { … }
    return Picture.create(picToSave).catch(err => {
        /* Handle errors from create */
    });
}, err => {
    /* Handle all errors from writeBig and writeSmall */
});

【讨论】:

    猜你喜欢
    • 2018-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 2019-06-26
    • 1970-01-01
    相关资源
    最近更新 更多