Функция React не возвращает обещание, даже когда обещание возвращается явно (Firebase Storage) - PullRequest
0 голосов
/ 16 марта 2020

Я работаю над своим проектом Firebase, и он работал до вчерашнего дня - прошел месяц или около того. Я не знал, почему он тайно перестал работать.

В двух словах, моя функция под названием uploadProfilePi c ниже используется для вернуть обещание из Firebase Storage.

// upload [profilePic] to [destPath]
export const uploadProfilePic = (destPath, profilePic, isCropped) => dispatch => {
    dispatch(requestUploadPicToStorage(destPath));

    let ref = storageRef.child(destPath);

    // create file metadata including the content type
    var metadata = {
        contentType: profilePic.fileType,
    };

    // upload the data_url string to Firebase's Storage
    if (isCropped)
        return ref.putString(profilePic.cropURL, 'data_url', metadata); // promise returned
    else
        return ref.putString(profilePic.oriURL, 'data_url', metadata); // promise returned
}

Я добавил Promise.all () , чтобы проверить, не выполнено ли какое-либо из обещаний. Он работал в прошлом месяце и перестал работать вчера. У меня нет ни малейшего представления о том, почему он внезапно перестал работать.

export const uploadOriAndCrop = (username, profilePic, isOriPicUpdated) => dispatch => {
    let croppedPath = "/users/" + username + "_cropped_profile_pic" + profilePic.fileType;
    let oriPath = "/users/" + username + "_profile_pic" + profilePic.fileType;

    const promises = [];

    // upload cropped pic to firebase storage
    const promise1 = dispatch(uploadProfilePic(croppedPath, profilePic, true));
    promises.push(promise1); // promise1 is undefined

    // if we need to update the original picture
    if (isOriPicUpdated) {
        // upload original pic to firebase storage
        const promise2 = dispatch(uploadProfilePic(oriPath, profilePic, false));
        promises.push(promise2); // promise2 is undefined
    }

    // [promise1, promise2] is "undefined"
    return Promise.all(promises);
}

Меня поразило то, что все работает идеально, если я назову это так:

...
ref.putString(profilePic.cropURL, 'data_url', metadata)
.then((snapshot) => {
    console.log(snapshot);
})
...

Я мог бы легко уйти, повторив третий фрагмент кода пару раз. Однако я хочу, чтобы мои коды были чистыми и короткими.

Может кто-нибудь сказать мне, какова возможная причина «неопределенных» значений, возвращаемых uploadProfilePi c, когда он вызывается в uploadOriAndCrop ?

Спасибо!

Дополнительная информация

ref.putString(profilePic.cropURL, 'data_url', metadata); возвращает значение и не является неопределенным.

    // upload the data_url string to Firebase's Storage
    if (isCropped)
    {
        const val = ref.putString(profilePic.cropURL, 'data_url', metadata);
        console.log(val);
        return val; // val is not undefined
    }
    else
    {
        const val = ref.putString(profilePic.oriURL, 'data_url', metadata);    
        console.log(val); // val is not undefined
        return val;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...