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

时间:2016-04-20 09:36:54

标签: javascript angularjs

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

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);
            }
        });
    }

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

它是否会支持高级流程:

function updateItem(itemId, className, json, resolve, reject) {

        return getItem(className, itemId).then(function (item) {

            return saveItem(item, json);

        });
    }

2 个答案:

答案 0 :(得分:3)

您不应手动创建和解决新的承诺。 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);
}

答案 1 :(得分:0)

最好通过将它们“转换”为$q承诺来尽可能多地隔离其他promise语法。然后在其他地方使用常规$q语法。在你的情况下,假设Parse.Cloud使用显式回调,我会这样做:

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
    });
}