代码之家  ›  专栏  ›  技术社区  ›  Tometoyou

函数应返回字符串的承诺,但不返回

  •  -1
  • Tometoyou  · 技术社区  · 5 年前

    我正在尝试上载图像并返回其ID,代码如下:

    export function uploadImage(file: any, location: string, next: any): Promise<string> {
        try {
            if (!file) {
                throw new Error("No Image file");
            }
            const id = location + "/" + utilities.generatePushID();
            const options = {
                resource_type: "raw",
                public_id: id,
            };
            return cloudinary.uploader.upload_stream(options, (error: any, result: any) => {
                if (error) {
                     throw new Error("Couldn't upload");
                 }
                 return result.public_id;
            }).end(file.buffer);
        } catch (err) {
             return next(InternalError(err));
        }
    }
    

    但是,每当我试图调用函数时,它会返回一个 UploadStream 对象而不是 string 我想要的。就好像它立即返回上载程序,而不是上载程序的结果。为什么?

    1 回复  |  直到 5 年前
        1
  •  3
  •   cojack    5 年前

    因为 upload_stream 不返回承诺,如果你想做的是先决的,试试这个:

    export async function uploadImage(file: any, location: string, next: any): Promise<string> {
        return new Promise((resolve, reject) => {
            try {
                if (!file) {
                    reject(new Error("No Image file"));
                }
                const id = location + "/" + utilities.generatePushID();
                const options = {
                    resource_type: "raw",
                    public_id: id,
                };
                return cloudinary.uploader.upload_stream(options, (error: any, result: any) => {
                    if (error) {
                        reject(new Error("Couldn't upload"));
                    }
                    result(result.public_id);
                }).end(file.buffer);
            } catch (err) {
                reject(InternalError(err));
            } 
        });
    }
    

    摆脱 next 因为它看起来像是一个回调,所以您可以这样调用它:

    const public_id = await uploadImage(...);
    // or
    uploadImage(...).then(public_id => console.log(public_id)).catch(() => console.error);
    

    当做。