不能链接在云代码中返回Promise的自定义函数

Can't chain my custom function that returns a Promise in cloud code

本文关键字:返回 Promise 自定义函数 代码 链接 不能      更新时间:2023-09-26

我有一个返回承诺的函数。我在一系列承诺中使用了它,如下所示:

function1().then
(
    function( result )
    {
        return functionThatIsFailing();
    }
).then
(
    function( result )
    {
        response.success("It worked!");
    },
    function( error )
    {
        response.error("There was an error: " + error.message);
    }
);

但是如果我把事情改成以下,我得到"cannot call method 'then' of undefined at…"作为错误消息

function1().then
(
    function( result )
    {
        return functionThatIsFailing().then
        (
            function( result )
            {
                response.success("It Worked!");
            },
            function( error )
            {
                response.error("There was an error: " + error.message);
            }
        );
    }
);

这是正在讨论的自定义函数。它正在发送Twilio短信。函数本身可以工作。当函数失败时,我甚至收到了文本。

function sendSMSWrapper(to, from, body)
{
    var promise = new Parse.Promise();
    twilioClient.sendSms
    ({
        to: to,
        from: from,
        body: body
    }, function(err, responseData)
    {
        if(err)
        {
            promise.reject(err);
        }
        else
        {
            promise.resolve(responseData);
        }
    });
}

编辑-我已经更新了我的函数,尝试了一些不同的事情,以确保它返回一个承诺,按照Bergi的建议,但我仍然得到相同的"不能调用方法'then'的未定义…"错误信息。我要把这个打开。让我知道,如果你有一个建议,这个函数应该如何正确编写!

我的第一次尝试:

function sendSMSWrapper(to, from, body)
{
    var promise = new Parse.Promise();
    twilioClient.sendSms
    ({
        to: to,
        from: from,
        body: body
    }, function(err, responseData)
    {
        if(err)
        {
            promise.reject(err);
            return promise;
        }
        else
        {
            promise.resolve(responseData);
            return promise;
        }
    });
}

这不起作用,所以我试了这个:

    function sendSMSWrapper(to, from, body)
    {
        var promise = new Parse.Promise();
        twilioClient.sendSms
        ({
            to: to,
            from: from,
            body: body
        }, function(err, responseData)
        {
            if(err)
            {
                promise.reject(err);
            }
            else
            {
                promise.resolve(responseData);
            }
        });
        return promise;
    }

我尝试的最后一个hack方法:

function sendSMSWrapper(to, from, body)
{
    var promise = new Parse.Promise();
    var promise2 = new Parse.Promise();
    return twilioClient.sendSms
    ({
        to: to,
        from: from,
        body: body
    }, function(err, responseData)
    {
        if(err)
        {
            promise.reject(err);
        }
        else
        {
            promise.resolve(responseData);
        }
    });
    return Parse.Promise.when( promise ).then
    (
        function( result )
        {
            console.log(result);
            promsie2.resolve(result);
            return promise2;
        },
        function( error )
        {
            console.log(error);
            promise2.reject(error);
            return promise2;
        }
    )
}

显然functionThatIsFailing()没有返回承诺。事实上,您的sendSMSWrapper缺少return语句(即使创建了承诺)。