I'm a bit confused here, this part of some async code isn't working. Here's the problem:
export async function active() {
return new Promise(function(resolve,reject){
fetch("https://api.spotify.com/v1/me", { //omitted headers to keep it clean
}).then(response => console.log(response)) <-- This code runs, and will log a response
.then(data => function(){ <-- but this won't
console.log("This won't run either")
if (data.status == 200) {
console.log(true)
resolve(data)
} else {
console.log(false)
reject(data)
}
})
})
}
Run Code Online (Sandbox Code Playgroud)
Why isn't the second part running? Sorry, I'm a …
我正在编写一个React应用程序,在某些情况下,我必须解决嵌套的Promise。代码可以正常工作,但是我无法将resolve()函数传播到外部层次,因此无法获得返回值。
这是代码:
writeData(data) {
this.store.dispatch({type: "START_LOADER"})
return new Promise((resolve, reject) => {
this.manager.isDeviceConnected(this.deviceId).then(res => {
this.manager.startDeviceScan(null, null, (error, device) => {
if (device.id === this.deviceId) {
resolve("test") // -> this is propagate correctly
device.connect().then((device) => {
this.store.dispatch({type: "SET_STATUS", payload: "Device is connected!\n"})
return device.discoverAllServicesAndCharacteristics()
}).then((device) => {
device.writeCharacteristicWithoutResponseForService(
data.serviceId,
data.charId,
data.dataToWrite
).then(res => {
resolve("test2") // -> this is not propagated
}).catch(error => {
reject(error.message)
})
}).catch((error) => {
reject(error.message)
});
}
});
}).catch(error => {
reject(error.message)
}) …Run Code Online (Sandbox Code Playgroud) 我正在探索 Promise.all() 的使用,但我不知道为什么它没有给我预期的结果。我尝试一步一步地说明它。
让我们看一下我的代码:
var p2 = 1337;
var p3 = new Promise((resolve, reject) => {
setTimeout(resolve, 2000, 'foo');
});
var apiCall = async () =>{
// to simulate a api call that will response after 5 sec
setTimeout(() => {return 1000}, 5000);
}
Promise.all([p2,p3,apiCall()]).then(values => {
console.log(values); // [3, 1337, undefine], but I expect [3, 1337, 1000]
});
apiCall().then((response)=>{console.log(response)})
Run Code Online (Sandbox Code Playgroud)
据我了解,async 函数会立即返回一个 Promise,这就是 Promise.all 会等待的。
所以我期望,
.then(values => {
console.log(values); // [3, 1337, undefined]
});
Run Code Online (Sandbox Code Playgroud)
5秒后才会执行。
但 2 秒后的输出已经如下所示,而不是 [3, …
我想知道这个承诺是否可以。因为我正在使用await它们内部。
示例1:
new Promise(async (resolve, reject) => {
await fetch(url, postReq)
.then((data) => {
return data.json();
})
.then((res) => {
console.log(res);
resolve("Message sent successfully");
})
.catch((error) => {
console.log(error);
reject(error);
});
});
Run Code Online (Sandbox Code Playgroud)
示例2:
const sendEmail = async (reciever, data) => {
new Promise(async (resolve, reject) => {
console.log("Sending Email");
try {
// create reusable transporter object using the default SMTP transport
let transporter = nodemailer.createTransport({
service: "gmail",
auth: {
user: process.env.EMAIL_ADDRESS,
pass: process.env.EMAIL_PASSWORD,
},
});
// send mail …Run Code Online (Sandbox Code Playgroud) 我对 JavaScript Promise 有一个问题,其中一个 Promise 没有进入 then()
下面是我试图完成的代码。
背景:我之前没有使用过Promise,但是看过几篇文章。
function doStart(){
var loadedMap = loadBasemap([layer0]);
loadedMap.then(function (v) {
view = loadView(MAP_CANVAS_ID, map);
...
});
...
}
function loadBasemap(layers) {
if (LayerSettings && LayerSettings.hasOwnProperty('basemap') && LayerSettings.basemap.hasOwnProperty('baseMapLayers')) {
new Promise(function () {
updateToDefaultLayerSetting();
}).then(function () {
map = new Map({
basemap: Basemap.fromJSON(LayerSettings.basemap),
layers: layers
});
});
return new Promise((resolve, reject) => resolve(map));
}
else {...}
}
async function updateToDefaultLayerSetting() {
console.log("Calling default");
const result = await actionDefaultBasemap();
console.log(result);
}
var defaultBasemap;
function …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用服务制作基本数据并在我有数据时将其打印在屏幕上,但有些东西无法正常工作.
我的服务:
mymodule.factory('MyService', function($http, $q) {
var service = {
getData: function() {
var dfd = $q.defer();
$http.get(apiServerPath).success(function (data) {
dfd.resolve(data);
});
return dfd.promise;
}
}
return service
}
Run Code Online (Sandbox Code Playgroud)
我的控制器:
mymodule.controller('myCtrl', ['$scope', 'MyService', function($scope, MyService) {
$scope.myvar = MyService.getData();
}
Run Code Online (Sandbox Code Playgroud)
HTML
<div> {{myvar}} </div>
Run Code Online (Sandbox Code Playgroud)
我从浏览器控制台可以看到什么 -
鉴于这种模式
someArray.reduce(function(p, item) {
return p.then(function() {
return someFunction(item);
});
}, $.Deferred().resolve()).then(function() {
// all done here
// access accumulated fulfilled , rejected `Promise` values
}, function err() {
});
Run Code Online (Sandbox Code Playgroud)
什么方法可以将已完成的,被拒绝的Promise对象的累积值返回到.then(fulfilled)调用后的数组.reduce()?
function someFunction(index) {
console.log("someFunction called, index = " + index);
var $deferred = $.Deferred();
window.setTimeout(function() {
$deferred.resolve();
}, 2000);
return $deferred.promise();
}
var someArray = [1,2,3,4,5];
someArray.reduce(function(p, item) {
return p.then(function() {
return someFunction(item);
});
}, $.Deferred().resolve()).then(function(data) {
// all done here
console.log(data, …Run Code Online (Sandbox Code Playgroud)javascript ×6
promise ×4
angularjs ×1
arrays ×1
async-await ×1
asynchronous ×1
es6-promise ×1
http ×1
node.js ×1
q ×1
reactjs ×1