我是angularjs的新手.我的目标非常简单.我想进行ajax调用以获取数据,并且一旦完成,我想再次调用以获取依赖于第一组信息的另一组数据.
我正在尝试利用promise机制这样做,以便我可以利用链接而不是嵌套的ajax调用,并且更好地保留具有我可以根据需要绑定在一起的独立函数的能力.
我的代码类似于以下内容:
var promiseGetWorkTypes = function ($q, $scope, $http) {
console.log("promiseGetWorkTypes");
return $q(function (resolve, reject) {
$http({
method: 'GET',
url: '/WorkTypes'
}).then(
function (payload) {
console.log("Got workttypegroups")
console.log(payload);
$scope.WorkTypeGroups = payload.data;
console.log("End of worktypegroups");
resolve(payload);
},
function (payload) {
reject(payload);
});
});
};
var promiseGetRecentActivities = function ($q, $scope, $http) {
console.log("promiseGetRecentActivities");
return $q(function (resolve, reject) {
$http({
method: 'GET',
url: '/RecentHistory'
}).then(
function (payload) {
$scope.RecentActivities = payload.data;
resolve(payload);
},
// data contains the response
// status is …Run Code Online (Sandbox Code Playgroud)我是承诺并使用rsvp实现的新手.
我想异步读取文件列表,然后只有在读取了所有文件后才进入另一个任务.
我已经有了基本结构来读取一个文件,并链接到下一个任务:
var loadFile = function (path) {
return new rsvp.Promise(function (resolve, reject) {
fs.readFile (path, 'utf8', function (error, data) {
if (error) {
reject(error);
}
resolve(data);
});
});
};
loadFile('src/index.txt').then(function (data) {
console.log(data);
return nextTask(data);
}).then(function (output) {
//do something with output
}).catch(function (error) {
console.log(error);
});
Run Code Online (Sandbox Code Playgroud)
我想做这样的事情:
loadFile(['src/index.txt', 'src/extra.txt', 'src/another.txt']).then( ...
Run Code Online (Sandbox Code Playgroud)
我在文档中看到过承诺和承诺的数组,但我不知道哪个是最相关的,或者如何使用它们.我需要在上面的问题的上下文中使用它们的一个例子来理解它们.
对于一个有角度的项目,我必须嵌套承诺,我遇到了我不确定我在做什么的情况.这是我的一个代码:
return Action1().then(function (data) {
var defer = $q.defer();
if (data.condition) {
$q.all([Action2(), Action3(), Action4()]).then(function () {
defer.resolve();
});
} else {
defer.reject("error_code");
}
return defer.promise;
});
Run Code Online (Sandbox Code Playgroud)
Action1,Action2,Action3和Action4正在使用promises函数.这是很多承诺和行动取决于条件.我可以这样做,并确保我的主要功能将始终被解决或拒绝?
我读到我们可以在promise函数中传递promise.我可以这样做,这与上面相同:
return Action1().then(function (data) {
var defer = $q.defer();
if (data.condition) {
defer.resolve($q.all([Action2(), Action3(), Action4()]);
} else {
defer.reject("error_code");
}
return defer.promise;
});
Run Code Online (Sandbox Code Playgroud) 参考Rookie的错误#4:在Nolan Lawson的文章中使用"deferred":我们在承诺方面存在问题(顺便说一下这篇文章!),我尽量不再使用延迟风格的承诺.最近我遇到了一个实际的例子,我无法弄清楚如何以延迟的方式编码,所以我需要一些建议.
这是一个角度工厂的例子:
function ConfirmModal($q, $modal) {
return {
showModal: function _showModal(options) {
var _modal = $modal(options)
var deferred = $q.defer()
_modalScope.confirm = function(result) {
deferred.resolve(result)
_modal.hide()
}
_modalScope.cancel = function(reason) {
deferred.reject(reason)
_modal.hide()
}
return deferred.promise
}
}
}
Run Code Online (Sandbox Code Playgroud)
我隐藏了一些不相关的细节(例如实现_modalScope),核心思想是:$modal提供一个包含两个按钮的ui小部件:确认和取消.当确认是被点击,调用_modalScope.confirm和解决延期的承诺,否则通过调用拒绝延期的承诺_modalScope.cancel时,取消是被点击.
我试图通过使用重写return $q(function(resolve, reject) { ... }),但我真的不知道如何/何时调用resolve和reject在这个构造函数中,因为真正的逻辑在_modalScope.confirm/cancel方法中.几天我一直在努力解决这个问题,真的希望有人可以帮助我.
谢谢!
我的情况是我必须按顺序从服务器获取数据,我希望在Promises的帮助下完成.这是我到目前为止所尝试的:
function getDataFromServer() {
return new Promise(function(resolve, reject) {
var result = [];
(function fetchData(nextPageToken) {
server.getData(nextPageToken).then(function(response) {
result.push(response.data);
if (response.nextPageToken) {
fetchData(response.nextPageToken);
} else {
resolve(result);
}
});
})(null);
});
}
getDataFromServer().then(function(result) {
console.log(result);
});
Run Code Online (Sandbox Code Playgroud)
第一次获取成功,但后续调用server.getData()未运行.我认为它与第一个then()没有实现有关.我该如何缓解这个问题?
我想用来Promise.all()处理两个promise对象,但第二个是内部一个if表达式。如何处理这种情况?
它看起来像这样:
functionA();
if(true) {
functionB();
}
Run Code Online (Sandbox Code Playgroud)
functionA()并且functionB()都返回一个 promise 对象。在正常情况下,我可以使用
Promise.all([
functionA(),
functionB()
]).then(resule => {
console.log(result[0]); // result of functionA
console.log(result[1]); // result of functionB
})
Run Code Online (Sandbox Code Playgroud)
但是如何处理if表达式呢?我应该if(true){functionB()}用 a包裹new Promise()吗?
我在memcached上使用bluebird库.
memcached.set('foo', 'bar', 10, function (err) { /* stuff */ });
Run Code Online (Sandbox Code Playgroud)
这个函数不会在第二个参数中调用成功回调,所以看起来像.then(res)函数没有被调用.
Promise.promisifyAll(memcached);
memcached.setAsync(hashedCacheKey, obj).then(function (res) {
resolve(res);
}).catch(function (err) {
reject(err, null);
});
Run Code Online (Sandbox Code Playgroud)
我有什么方法可以处理无谓的成功事件吗?
我对承诺很陌生,认为我可能会混淆从承诺返回并传递给.then块.catch的内容。我在下面的注释行上收到 TypeError ,但是当我将其更改为
.then(Promise.resolve)
Run Code Online (Sandbox Code Playgroud)
到 .then((obj) => { Promise.resolve(obj); })
错误消失。这里有什么区别?我是否误解了如何链接承诺?
var mongoose = require('mongoose');
mongoose.Promise = require('bluebird');
mongoose.set('debug', true);
var FoodItem = require('../models/FoodItem.js');
var UserFoodItem = require('../models/UserFoodItem.js');
var User = require('../models/User.js');
var StockController = {};
StockController.createUserFoodItem = function(userId, {name, qty}) {
var userItem = new UserFoodItem({
user: new mongoose.Types.ObjectId(userId),
dateAdded: new Date(),
quantity: qty
});
return new Promise((resolve, reject) => {
FoodItem.findOne({ 'name': name })
.then((foodItem) => {
if (foodItem) {
userItem.foodItem = foodItem;
userItem.save().then((userFoodItem) …Run Code Online (Sandbox Code Playgroud) 在 Node.js 中,我尝试循环某些项目,为每个项目完成一个异步过程,然后等待每个项目完成后再开始下一个项目。我一定做错了什么,因为 Promise.all() 没有等待任何异步进程完成!我的代码如下:
getChildLessons() {
return new Promise((resolve, reject) => {
Promise.all(
//nested for loop is needed to get all information in object / arrays
this.lessons.levels.map((item, i) => {
item.childlevels.map((childItem, iChild) => {
return ((i, iChild) => {
//return async process with Promise.resolve();
return this.horseman
.open(childItem.url)
.html()
.then((html) => {
//adding some information to an array
})
.then(() => {
return Promise.resolve();
}).catch((err) => {
reject(err);
});
})(i, iChild);
});
})
// Promise.all().then()
).then(() => {
resolve(this.lesson);
}) …Run Code Online (Sandbox Code Playgroud) 使用异步 javascript 时,每秒函数如下所示:
function_name()
{
return new Promise((resolve,reject) => {
// do some async task
resolve();
});
}
Run Code Online (Sandbox Code Playgroud)
即使使用 es6 async/await,我也无法避免“return new Promise((resolve,reject) => { ...”这一部分。
有没有另一种方法可以在没有所有这些重复行的情况下编写这样的代码?
谢谢。
promise ×8
javascript ×7
node.js ×4
angularjs ×3
es6-promise ×3
asynchronous ×2
bluebird ×2
ajax ×1
deferred ×1
ecmascript-6 ×1
memcached ×1
rsvp-promise ×1
rsvp.js ×1