我正在发出一系列 http 请求,当它们返回时,我需要将结果归档到列表对象中。我正在使用角度承诺。
因为 Promise 只会在 for 循环完成后解析,所以它们都会被归档到列表的最后一个索引中。
for (var i = 0;i < list.length; i+=1) {
Promise.do(action).then(function(result) {
list[i] //i is always at last index because the for loop has already completed
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个关于 Javascript 承诺链的问题。假设我在承诺链的某个地方有一个行动。该操作不会返回任何值,但必须在链继续之前完成。
我需要将这个行动包含在一个承诺中吗?我需要这样的东西吗:
$q.when();
Run Code Online (Sandbox Code Playgroud)
请参阅下面我的代码:
...
var goToDashboard = function () {
//TODO: use $q here?
$state.go('dashboard');
};
...
activateEmail().then(signinByToken).then(setPersonalInfo).then(goToDashboard).then(somethingElse).catch(reportProblem);
Run Code Online (Sandbox Code Playgroud)
有人可以建议吗?
我无法理解角度分量范围。如果我做类似的事情:
function myComponent(){
this.data = 'Hello World';
}
let myModule = angular.module('myModule', []);
myModule.component('myComponent', {
template: `<div>{{$ctrl.data}}</div>`,
controller: myComponent
});Run Code Online (Sandbox Code Playgroud)
<script data-require="angularjs@1.5.8" data-semver="1.5.8" src="https://opensource.keycdn.com/angularjs/1.5.8/angular.min.js"></script>
<div ng-app="myModule">
<my-component></my-component>
</div>Run Code Online (Sandbox Code Playgroud)
它打印得很好......现在,如果我做一个小的修改并使其异步:
function myComponent(){
Promise.resolve().then(_ => {
this.data = 'Hello World';
});
}
let myModule = angular.module('myModule', []);
myModule.component('myComponent', {
template: `<div>{{$ctrl.data}}</div>`,
controller: myComponent
});Run Code Online (Sandbox Code Playgroud)
<script data-require="angularjs@1.5.8" data-semver="1.5.8" src="https://opensource.keycdn.com/angularjs/1.5.8/angular.min.js"></script>
<div ng-app="myModule">
<my-component></my-component>
</div>Run Code Online (Sandbox Code Playgroud)
它不打印任何东西。我可以使用点击处理程序更改该值,但对于 http 和其他异步操作,它不起作用。
function getNamesById(nameIds) {
var defer = $q.defer();
var result = [];
nameIds.forEach(function (nameId) {
account.getNameById(nameId).then(function (name) {
result[nameId] = name;
});
});
defer.resolve(result);
return defer.promise;
}
Run Code Online (Sandbox Code Playgroud)
我上面的代码显然没有按预期工作。我必须迭代一个 id 数组并构造另一个以 id 作为键的数组,以及从异步函数获取的值
我正在一个 Angular4 + PHP 网站上工作,在那里我使用 Promise 向服务器发送 HTTP 请求,因为我希望我的应用程序根据服务器的响应执行路由。我想访问 then() 中的一个类变量,但它会引发undefined()错误。
这是我的代码:
status = false;
checkUser(): Promise<any>{
// .....
return this.http
.get('http://localhost:8000/api/user', this.options)
.toPromise()
.then(this.extractData)
.catch(this.handleError);
}
private extractData(res: any) {
data = res.json();
this.status = data.status; // here it throws error undefined
return this.status;
}
Run Code Online (Sandbox Code Playgroud)
有没有其他方法可以实现这一点?
调用返回承诺的函数时,除非删除异步运算符,否则返回未定义,然后返回 ZoneAwarePromise,但不包含任何数据。
我知道查询在函数执行时返回数据,但是它似乎没有将该数据传递给函数调用的实际返回部分。
我查看了几个没有回答这个问题的堆栈问题,包括这个问题: Async/Await with Request-Promise Returns Undefined
这是使用 REST 端点来提取数据,console.logs 确实显示数据是正确的,但是返回未定义
this.allPeople.forEach(async person => {
const dodString = await this.getRelatedRecords(person); //undefined
}
Run Code Online (Sandbox Code Playgroud)
这是返回承诺/数据的主要功能
async getRelatedRecords(person) {
// function truncated for clarity
// ...
//
console.warn('This async should fire first');
selPeopleTable.relationships.forEach(relationship => {
allRelationshipQueries.push(
arcgisService.getRelatedTableData(
selPeopleTable.url, [person[oidField.name]], relationship.id, relationship.name),
);
});
await Promise.all(allRelationshipQueries).then(allResults => {
console.log('Inside the Promise');
// The Specific node I am looking for
const data = allResults[1].results.relatedRecordGroups[0].relatedRecords[0].attributes.dod;
console.log(data); // Shows correctly as the data …Run Code Online (Sandbox Code Playgroud) 我正在尝试从本地存储中获取一些数据,但是我想使用的日期是ready。就像是:
// this belongs to a Helper factory
getData: function(){
var deferred = jQuery.Deferred();
setTimeout(function(){
var data = {
description: localStorageService.get('description'),
};
deferred.resolve()
}, 10);
return deferred.promise();
},
// I set it up so that in the controller I can do
// $scope.data = Helper.getData();
Run Code Online (Sandbox Code Playgroud)
类似于我的示例,我只想在data对象具有description本地存储后返回它
我正在使用angularjs,因此{{data}}一旦解决诺言,我想在我的视图中显示。例如可能使用ng-hide或类似的东西。
无论如何,我的问题是关于建立那个诺言。
有任何想法吗?
javascript local-storage jquery-deferred angularjs angular-promise
我有一个角度服务,包装我的其余api调用并返回$ http承诺.
我的问题是如何抛出一个错误,以便调用触发.error方法的promise?我不想抛出错误,因为我希望它在调用函数中使用.success/.error而不是在它周围执行try catch块.
myFunction: function(foo)
if (foo) {
return $http.put(rootUrl + '/bar', {foo: foo});
}
else {
//what do I return here to trigger the .error promise in the calling function
}
Run Code Online (Sandbox Code Playgroud) 此示例尝试使同步代码异步.我发现的所有例子都是相反的,除了docs.angularjs.org .. $ q下面的主要第一个例子.
该文档列出了我试图使用的$ q构造函数.不幸的是,jsfiddle Angular库1.1.1和1.2.1提供了一个$ q对象(不是函数),如本例所示.相反,我将提供我的例子,并希望有人会看到这个错误.
https://docs.angularjs.org/api/ng/service/ $ q
我需要看到"这不会发生!" 要执行的行.
f = function(name) {
return $q(function(resolve, reject) {
console.log "this does not happen!"
resolve('great')
});
}
f(name).then(function(result) {
console.log 'result', result
}, function(error) {
console.log 'error', error
});
Run Code Online (Sandbox Code Playgroud)
而不是记录"这不会发生!" 接着是"伟大的",我实际上看到传递给$ q的函数记录::
result function(resolve, reject) {
console.log "this does not happen!"
resolve('great')
}
Run Code Online (Sandbox Code Playgroud)
谁能看到我做错了什么?
我正在使用angular-ui-bootstrap桥库进行角度和bootstap.我想要实现的是重用模态组件并将其包装在一个promise中,当模态成功关闭(按下OK按钮时)或拒绝模式(cancel按下按钮或在模态外按下按钮)时,它将被解析.
据我所知,有$modal来自桥库的服务,它只有一种方法:open(options).还有内置的角度承诺实现:$q.我正在寻找一种如何将两者结合起来的方法.
我想要一个自定义组件(服务,工厂?),它将提供一个startFlow返回promise的方法.调用startFlow也会打开bootstrap模式.当模态被关闭(正面或负面)时,承诺将被解决或拒绝.
有人可以暗示如何实现吗?到目前为止,我还没有找到现有的解决方案......
javascript promise twitter-bootstrap angularjs angular-promise
angular-promise ×10
angularjs ×8
javascript ×6
promise ×4
typescript ×2
angular ×1
angular8 ×1
es6-promise ×1
http ×1