我使用下面的代码来简化后端请求,但我没有了解如何调用成功方法或错误方法。
如何达到代码中注释的预期行为?
app.factory('REST', function ($http, $q, sweetAlert) {
返回 {
负载:功能(模块,动作,数据){
var deferred = $q.defer();
var promise = deferred.promise;
$http
.post('/api/'+module+'.php?action='+action, data)
.成功(功能(数据){
如果(数据错误)
{
sweetAlert.swal({
标题:“错误”,
文本:数据错误,
类型:“警告”
});
//这里我想调用 .error(details)
}
别的
deferred.resolve(data.result);
}).错误(函数(){
//这里我想调用 .error(details)
});
promise.success = 函数(fn){
承诺。然后(fn);
回报承诺;
}
回报承诺;
}
};
});
这是使用上面代码的代码:
$scope.login = function () {
$scope.loading = true;
var payload = {'credentials': $scope.logindata};
REST.load('access', 'login', payload).success(function(data) {
if(data.redirect)
$state.go(data.redirect);
$scope.loading = false;
}).error(function(data) { //THIS SHOULD BE CALLED
$scope.loading = …Run Code Online (Sandbox Code Playgroud) 有了request库,有没有办法使用 Promise 来简化这个回调?
var context = {};
request.get({
url: someURL,
}, function(err, response, body) {
context.one = JSON.parse(body);
request.get({
url: anotherURL,
}, function(err, response, body) {
context.two = JSON.parse(body);
// render page
res.render('pages/myPage');
});
});
Run Code Online (Sandbox Code Playgroud) 我有一个factory在获取json文件时向我提供的承诺:
myapp.factory('topAuthorsFactory', function($http, $q) {
var factory = {
topAuthorsList: false,
getList: function() {
var deffered = $q.defer();
$http.get('../../data/top_10_authors.json')
.success(function(data, status) {
factory.topAuthorsList = data;
}).error(function(data, status) {
deffered.reject('There was an error getting data');
});
return deffered.promise;
}
};
return factory;
});
Run Code Online (Sandbox Code Playgroud)
在我的controller我想要json在我的控制台上显示文件的内容如下:
myapp.controller('topAuthorsController', function($scope, topAuthorsFactory) {
$scope.listAuthors = topAuthorsFactory.getList().then(function(topAuthorsList) {
$scope.listAuthors = topAuthorsList;
console.log('Testing...');
}, function(msg) {
alert(msg);
});
console.log($scope.listAuthors);
}
Run Code Online (Sandbox Code Playgroud)
但是在我的控制台中,我得到了这个:
那我怎么解决这个问题呢?为什么我在控制台中看不到"测试......"的消息?
promise angularjs angularjs-controller angularjs-factory angular-promise
这可能是一个有很多答案的问题,或者你需要看到我的实际代码来帮助我.对于我所看到的行为,可能有一个原因(或少数原因).第一个问题:这是什么?如果是前者,我会撤回这个问题,这样人们就不会浪费时间.无论如何,我无法分享代码并且它比适当的更长.
我正在使用bluebird for Promises在Node.JS中编写JavaScript.我的部分代码适合这个模型.
const Promise = require('bluebird');
function a() {
return new Promise(function(resolve, reject) {
<... do something>
<either> return resolve();
<or> return reject();
})
}
a()
.catch(error => { console.log('Used .catch error=', error) })
.then(result => { console.log('Used .then result=', result) });
Run Code Online (Sandbox Code Playgroud)
在我的代码的某些部分拟合这个模型,我看到一个日志语句的结果.在我的代码的其他部分适合这个模型,我也看不到.在后面的部分,当我跟踪执行路径与调试,它完成之后a,它把绿色的亮点就(error在.catch(error => {与next上}合包含无极a,它.then和它的.catch,并next在(后通过一些蓝鸟代码会)}闭幕包含相同Promise的函数.
JSHint没有识别任何相关内容.
当我使用本机Promise时,我看到了非常相似的行为.我解决了它,然后代替bluebird Promises.现在我看到蓝鸟在不同的地方做同样的事情.
如果这是一个已知且易于描述的原因,我将非常感谢您的帮助.如果它大于那个,这个问题可能不属于Stack Overflow; 我会撤回它.
提前致谢.
如何捕获由Reflect.get(target, name, receiver)代理处理程序异步引发的错误?
我正在使用Proxy和Reflect来包装API类,以便可以捕获任何网络异常并向用户正常显示错误消息。
//Wrapper.js
let handler = {
get: (target, name, receiver) => {
try {
Reflect.get(target, name, receiver); //throws Error asynchronously
} catch (e) {
console.log('caught error', e);
}
};
export default new Proxy(new API(), handler);
//App.js import Wrapper from './Wrapper'; Wrapper.asyncFunction(); //throws uncaught Error
//API.js
class API {
get user() {
return new User()
}
}
//User.js
class User {
/**
* List all users
*/
all() {
return … 继承我的代码:
var delete_card = function(){
stripe.customers.deleteCard(
this.service_id.stripe,
this.credit_card[0].stripe_id
)
.then(function(obj){
this.recipients.splice(0, 1);
return this.save()
})
}
Run Code Online (Sandbox Code Playgroud)
条带调用和保存调用都返回promise.
我如何从delete_card方法返回一个promise?
我会像新的Promise一样包装它们并从那里返回一个承诺吗?
我将如何构建,以便将错误和结果冒出来?
我希望能够像这样从调用者那里做一些事情:
delete_card
.then(...)
.catch(...)
Run Code Online (Sandbox Code Playgroud)
并继续撰写链式承诺?
我是Angularjs的新手,我正在学习本教程:http://mherman.org/blog/2015/07/02/handling-user-authentication-with-the-mean-stack/#.WE70iubhCM8 .但是我不明白何时使用$ q.defer().例如,在下面的Angularjs代码中,为什么要使用$ q.defer():
function login(username, password) {
// create a new instance of deferred
var deferred = $q.defer();
// send a post request to the server
$http.post('/user/login',
{username: username, password: password})
// handle success
.success(function (data, status) {
if(status === 200 && data.status){
user = true;
deferred.resolve();
} else {
user = false;
deferred.reject();
}
})
// handle error
.error(function (data) {
user = false;
deferred.reject();
});
Run Code Online (Sandbox Code Playgroud)
服务器端代码是:
router.post('/login', function(req, res, next) {
passport.authenticate('local', function(err, user, info) …Run Code Online (Sandbox Code Playgroud) 我有一个函数数组,其中每个函数promise从ajax调用返回.
var promises = [];
if (form.$valid) {
Object.keys($scope.Model.Data.FormFiles).forEach(function (key) {
var file = $scope.Model.Data.FormFiles[key];
function uploadFile(){
var deferred = $q.defer();
var upload = Upload.upload({
url: "/api/ir/funnelApi/UploadFile",
data: { file: file }
});
upload.then(function (response) {
// do something
deferred.resolve(response.statusText);
}, function (error) {
deferred.reject(error.data);
}, function (evt) {
});
return deferred.promise;
}
promises.push(uploadFile);
});
}
Run Code Online (Sandbox Code Playgroud)
我想要做的是,如果所有文件都已成功上传,那么做一些事情.
$q.all(promises).then(function (responses) {
// do something
}, function (errors) {
// if any of the file upload fails, it should come …Run Code Online (Sandbox Code Playgroud) 我有以下代码用于处理Magento 2 REST API。
return new Promise((resolve, reject) => {
fetch(uri, { method, headers, body: JSON.stringify(data) })
.then(response => {
return response.json();
})
.then(responseData => {
resolve(responseData);
})
.catch(error => {
reject(error);
});
});
Run Code Online (Sandbox Code Playgroud)
我想添加响应状态检查,所以我已经开始像这样
return new Promise((resolve, reject) => {
fetch(uri, { method, headers, body: JSON.stringify(data) })
.then(response => {
return {
data: response.json(),
ok: response.ok,
status: response.statusText
};
})
.then(responseResult => {
if (responseResult.ok) {
resolve(responseResult.data);
} else {
const error = responseResult.status || responseResult.data.message;
reject(error);
}
}) …Run Code Online (Sandbox Code Playgroud) Axios被描述为基于Promise的,因此在使用Axios查询数据时是否需要返回新的Promise?
app.get('/api/nearbyRecommendations', async (req, res) => {
if(!req.query) return res.send({ error: 'Please enable location to get recommendations.' })
try {
const { longitude, latitude } = req.query
const locationName = await location.getLocationName(longitude, latitude)
res.send(locationName)
} catch (error) {
res.send(error)
}
})
Run Code Online (Sandbox Code Playgroud)
我正在向MapBox API发出GET请求,但是即使为.xn()块中添加了一个新的Error,尽管为Axios请求设置了catch块,我也似乎从未收到任何错误。
const getLocationName = async (latitude, longitude) => {
return new Promise((resolve, reject) => {
axios.get(`https://api.mapbox.com/geocoding/v5/mapbox.places/${longitude},${latitude}.json?access_token=${darkSkyAPIKey}`, {json: true})
.then(response => {
if(!response.data) return reject({ error: 'No location found.' })
resolve(response.data)
}).catch(error => {
reject(error)
})
})
}
Run Code Online (Sandbox Code Playgroud)
如果可能的话,请提供帮助并指出可能进行更改以遵循最佳实践的任何内容。
promise ×9
javascript ×7
angularjs ×4
q ×3
bluebird ×2
fetch ×2
node.js ×2
ajax ×1
async-await ×1
axios ×1
callback ×1
deferred ×1
ecmascript-6 ×1
express ×1
mean-stack ×1