传递promise回调方法的更好方法

A better way to pass along promise callback methods

本文关键字:方法 更好 回调 promise 传递      更新时间:2023-09-26

我看到自己通过了解析并拒绝了很多方法:

function createChangeRequest(contactId) {
        return $q(function (resolve, reject) {
            parseAPI.runCloud('createChangeRequest', {contactId: contactId}, resolve, reject);
        });
    }

然后在目标函数中调用它们:

function runCloud(methodName, params, resolve, reject) {
        Parse.Cloud.run(methodName, params, {
            success: function (response) {
                // obtained secret string
                console.log(methodName + ' response -> ', response);
                resolve(response);
            },
            error: function (error) {
                // error
                console.log(methodName + ' error -> ', error);
                reject(error);
            }
        });
    }

它解决了我使用不同promise语法的需求。我觉得还有更好的方法。有吗?

它会支持高级流吗:

function updateItem(itemId, className, json, resolve, reject) {
        return getItem(className, itemId).then(function (item) {
            return saveItem(item, json);
        });
    }

您不应该手动创建和解析新的promise。Parse.cloud.run已经返回了一个promise对象,因此您应该以更简单的方式组织代码。类似这样的东西:

function createChangeRequest(contactId) {
  return parseAPI.runCloud('createChangeRequest', {contactId: contactId}).then(function(response) {
    console.log(response);
  })
  .catch(function() {
    console.log('Error ocurred');
  });
}
function runCloud(methodName, params, resolve, reject) {
  return Parse.Cloud.run(methodName, params);
}

最好通过将其他promise语法"转换"为$q promise来尽可能地隔离它们。然后在其他任何地方使用常规$q语法。在您的情况下,假设Parse。云与显式回调一起工作,我会这样做:

function runCloud(methodName, params) {
    var deferred = $q.defer();
    Parse.Cloud.run(methodName, params, {
        success: function (response) {
            // obtained secret string
            console.log(methodName + ' response -> ', response);
            deferred.resolve(response);
        },
        error: function (error) {
            // error
            console.log(methodName + ' error -> ', error);
            deferred.reject(error);
        }
    });
    return deferred.promise;
}

然后,在runCloud函数的所有用户中,您可以切换到常规的$q语法,如下所示:

function createChangeRequest(contactId) {
    parseAPI.runCloud('createChangeRequest', {contactId: contactId}).then(function(result){
        //do something with result
    });
}