我看到自己通过决心并拒绝了很多方法:
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);
});
}
答案 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
});
}