Вопросы по тегу: promise

(19)

Используйте async await с Array.map

Имеется следующий код:var arr = [1,2,3,4,5]; var results: number[] = await arr.map(async (item): Promise => { await callAsynchronousOperation(item); return item + 1; }); , что приводит к следующей ошибке: TS2322: Тип «Обещание []» не может быть назначен типу «число []». Тип 'Promise не может быть назначен типу' number '. Как исправить? Как я могу заставить async await и Array.map работать вместе?
A

Alon

5 лет назад

Ответов: 8

Размещение улова ДО и ПОСЛЕ

Мне сложно понять разницу между помещением .catch BEFORE и AFTER во вложенное обещание.Вариант 1:test1Async(10).then((res) => { return test2Async(22) .then((res) => { return test3Async(100); }).catch((err) => { throw "ERROR AFTER THEN"; }); }).then((res) => { console.log(res); }).catch((err) => { console.log(err); }); Альтернатива 2:test1Async(10).then((res) => { return test2Async(22) .catch((err) => { throw "ERROR BEFORE THEN"; }) .then((res) => { return test3Async(100); }); }).then((res) => { console.log(res); }).catch((err) => { console.log(err); }); Поведение каждой функции следующее: test1 терпит неудачу, если число test2 терпит неудачу, если число > 10, и test3 терпит неудачу, если число не 100. В этом случае test2 не работает.Я попытался запустить и сделать test2Async неуспешным, и ДО, и ПОСЛЕ затем ведут себя одинаково, и это не выполняет test3Async. Может кто-нибудь объяснить мне главное отличие размещения улова в разных местах?В каждой функции I console.log ('Running test X'), чтобы проверить, выполняется ли она.Этот вопрос возникает из-за моей предыдущей ветки Как превратить вложенный обратный вызов в обещание?. Я полагаю, что это другая проблема и стоит опубликовать другую тему.
Z

Zanko

5 лет назад

Ответов: 2

Использование setTimeout в цепочке обещаний

Здесь я пытаюсь обернуть голову вокруг обещаний. Здесь по первому запросу я получаю набор ссылок, а по следующему запросу я получаю содержимое первой ссылки. Но я хочу сделать задержку перед возвратом следующего объекта обещания. Поэтому я использую на нем setTimeout. Но это дает мне следующую ошибку JSON (без setTimeout () он работает нормально) SyntaxError: JSON.parse: неожиданный символ в строке 1 столбца 1 данные JSON я хотел бы знать, почему это не удается?let globalObj={}; function getLinks(url){ return new Promise(function(resolve,reject){ let http = new XMLHttpRequest(); http.onreadystatechange = function(){ if(http.readyState == 4){ if(http.status == 200){ resolve(http.response); }else{ reject(new Error()); } } } http.open("GET",url,true); http.send(); }); } getLinks('links.txt').then(function(links){ let all_links = (JSON.parse(links)); globalObj=all_links; return getLinks(globalObj["one"]+".txt"); }).then(function(topic){ writeToBody(topic); setTimeout(function(){ return getLinks(globalObj["two"]+".txt"); // without setTimeout it works fine },1000); });
A

AL-zami

5 лет назад

Ответов: 6

Как мне ожидать одновременного выполнения нескольких обещаний без «быстрого сбоя»?

Я использую async/await для параллельного запуска нескольких вызовов api:async function foo(arr) { const results = await Promise.all(arr.map(v => { return doAsyncThing(v) })) return results } Я знаю, что, в отличие от циклов, Promise.all выполняется параллельно (то есть часть ожидания результатов выполняется параллельно) .Но Я также знаю, что: Promise.all отклоняется, если один из элементов отклоняется и Promise.all терпит неудачу быстро: если у вас есть четыре обещания, которые разрешаются после тайм-аут, и один сразу отклоняет, тогда Promise.all отклоняет немедленно. Когда я это читал, если я Promise.all с 5 обещаниями, а первое завершившееся возвращает reject (), тогда остальные 4 эффективно отменяются, а их обещанный resolve () значения потеряны.А есть третий способ? Где выполнение фактически параллельно, но единичный сбой не испортит всю связку?
B

Brandon

5 лет назад

Ответов: 2

Как использовать выборку в TypeScript

Я использую window.fetch в Typescript, но я не могу передать ответ прямо на свой собственный тип:Я пытаюсь обойти это, приводя результат Promise к промежуточной переменной 'any'.What would be the correct method to do this?import { Actor } from './models/actor'; fetch(`http://swapi.co/api/people/1/`) .then(res => res.json()) .then(res => { // this is not allowed // let a:Actor = res; // I use an intermediate variable a to get around this... let a:any = res; let b:Actor = a; })
K

Kokodoko

5 лет назад

Ответов: 3

Массив JavaScript .reduce с помощью async / await

Похоже, возникли некоторые проблемы с включением async / await в .reduce (), например:const data = await bodies.reduce(async(accum, current, index) => { const methodName = methods[index] const method = this[methodName] if (methodName == 'foo') { current.cover = await this.store(current.cover, id) console.log(current) return { ...accum, ...current } } return { ...accum, ...method(current.data) } }, {}) console.log(data) Объект data регистрируется до this.store завершает ...Я знаю, что вы можете использовать Promise.all с асинхронными циклами, но применимо ли это к .reduce ()?
b

benhowdle89

5 лет назад

Ответов: 9

Получение UnhandledPromiseRejectionWarning при тестировании с использованием мокко / чай

Итак, я тестирую компонент, который полагается на эмиттер событий. Для этого я придумал решение, используя Promises с Mocha + Chai:it('should transition with the correct event', (done) => { const cFSM = new CharacterFSM({}, emitter, transitions); let timeout = null; let resolved = false; new Promise((resolve, reject) => { emitter.once('action', resolve); emitter.emit('done', {}); timeout = setTimeout(() => { if (!resolved) { reject('Timedout!'); } clearTimeout(timeout); }, 100); }).then((state) => { resolved = true; assert(state.action === 'DONE', 'should change state'); done(); }).catch((error) => { assert.isNotOk(error,'Promise error'); done(); }); }); На консоли я получаю «UnhandledPromiseRejectionWarning», хотя вызывается функция отклонения, так как она сразу показывает сообщение «AssertionError: Promise error» (узел: 25754) UnhandledPromiseRejectionWarning: необработанное обещание отклонение (идентификатор отклонения: 2): AssertionError: Ошибка обещания: ожидается {Object (message, showDiff, ...)} является ложным должен перейти с правильным событием А потом, через 2 секунды получаю Ошибка: превышено время ожидания 2000 мс. Убедитесь, что обратный вызов done () вызывается в этом тесте. Что еще более странно, поскольку был выполнен обратный вызов catch (я думаю, что по какой-то причине ошибка assert помешала остальной части выполнения)А теперь самое забавное: если я закомментирую assert.isNotOk (error ...), тест пройдет нормально без каких-либо предупреждений в консоли. Он по-прежнему «терпит неудачу» в том смысле, что выполняет перехват. Но все же я не могу понять эти ошибки с обещанием. Может кто просветит меня?
J

Jzop

5 лет назад

Ответов: 8

машинописный текст: ошибка TS2693: "Обещание" относится только к типу, но здесь используется как значение

Я пытаюсь использовать Typescript для своего AWS Lambda и получаю следующие ошибки всякий раз, когда использую обещания.error TS2693: 'Promise' only refers to a type, but is being used as a value here. Я пробовал использовать следующие варианты кода Использование конструктора PromiseresponsePromise = new Promise((resolve, reject) => { return reject(new Error(`missing is needed data`)) }) с использованием Promise.rejectresponsePromise = Promise.reject(new Error(`Unsupported method "${request.httpMethod}"`)); ВерсииНиже приведены версии в моих зависимостях dev:"typescript": "^2.2.2" "@types/aws-lambda": "0.0.9", "@types/core-js": "^0.9.40", "@types/node": "^7.0.12", Содержимое tsconfig.json{ "compileOnSave": true, "compilerOptions": { "module": "commonjs", // "typeRoots" : ["./typings", "./node_modules/@types"], "target": "es5", // "types" : [ "core-js" ], "noImplicitAny": true, "strictNullChecks": true, "allowJs": true, "noEmit": true, "alwaysStrict": true, "preserveConstEnums": true, "sourceMap": true, "outDir": "dist", "moduleResolution": "Node", "declaration": true, "lib": [ "es6" ] }, "include": [ "index.ts", "lib/**/*.ts" ], "exclude": [ "node_modules", "**/*.spec.ts" ] } Я использую grunt-ts со следующей конфигурацией для запуска задачи ts.ts: { app: { tsconfig: { tsconfig: "./tsconfig.json", ignoreSettings: true } }, ... Я пробовал использовать решение, упомянутое в Я получаю: [ts] 'Promise' относится только к типу, но здесь используется как значение, но не повезло.
k

kalyanvgopal

5 лет назад

Ответов: 22

Ошибки обработки Axios

Я пытаюсь лучше понять обещания javascript с помощью Axios. Я делаю вид, что обрабатываю все ошибки в Request.js и вызываю только функцию запроса из любого места без необходимости использовать catch ().В этом примере ответом на запрос будет 400 с сообщением об ошибке в формате JSON.Это ошибка, которую я получаю:Неперехваченная (в обещании) Ошибка: запрос завершился неудачно с кодом состояния 400Единственное решение, которое я нашел, - это добавить .catch (() => {}) в Somewhere.js, но я стараюсь этого не делать. Возможно ли это?Вот код: Request.js export function request(method, uri, body, headers) { let config = { method: method.toLowerCase(), url: uri, baseURL: API_URL, headers: { 'Authorization': 'Bearer ' + getToken() }, validateStatus: function (status) { return status >= 200 && status Somewhere.js export default class Somewhere extends React.Component { ... callSomeRequest() { request('DELETE', '/some/request').then( () => { console.log('Request successful!') } ) } ... }
m

mignz

4 года назад

Ответов: 8

Как узнать, какие обещания не обрабатываются в Node.js UnhandledPromiseRejectionWarning?

Node.js из версии 7 имеет синтаксический сахар async / await для обработки обещаний, и теперь в моем коде довольно часто появляется следующее предупреждение: (node:11057) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): ReferenceError: Error: Can't set headers after they are sent. (node:11057) DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code. К сожалению, нет ссылки на строку, в которой отсутствует ловушка. Есть ли способ найти его, не проверяя каждый блок try / catch?
u

user1658162

5 лет назад

Ответов: 4

Why is my asynchronous function returning Promise { <pending> } instead of a value?

Мой код:let AuthUser = data => { return google.login(data.username, data.password).then(token => { return token } ) } И когда я пытаюсь запустить что-то вроде этого:let userToken = AuthUser(data) console.log(userToken) Получаю:Promise { } Но почему?Моя основная цель - получить токен из google.login (data.username, data.password), который возвращает обещание, в переменную. И только потом выполняем какие-то действия.
S

Src

5 лет назад

Ответов: 8

Как передать параметр функции обещания

это может показаться глупым вопросом, но я новичок в этой теме. Я работаю над обещаниями на node js. И я хочу передать параметр функции обещания. Однако я так и не понял.someModule.someFunction.then(username, password,function(uid) { /*stuff */ } , а функция выглядит примерно такvar someFunction = new Promise(username, password, function(resolve, reject) { /*stuff using username, password*/ if ( /* everything turned out fine */ ) { resolve("Stuff worked!"); } else { reject(Error("It broke")); } });
k

kundante

6 лет назад

Ответов: 7

Что эквивалентно Bluebird Promise. Наконец в собственных обещаниях ES6?

Bluebird предлагает finally метод, который вызывается независимо от того, что происходит в вашей цепочке обещаний. Я считаю, что это очень удобно для очистки (например, разблокировка ресурса, скрытие загрузчика, ...)Is there an equivalent in ES6 native promises?
A

Aric Lasry

6 лет назад

Ответов: 1

Как создать Observable из статических данных, подобных http в Angular?

У меня есть служба, в которой есть этот метод:export class TestModelService { public testModel: TestModel; constructor( @Inject(Http) public http: Http) { } public fetchModel(uuid: string = undefined): Observable { if(!uuid) { //return Observable of JSON.stringify(new TestModel()); } else { return this.http.get("http://localhost:8080/myapp/api/model/" + uuid) .map(res => res.text()); } } } в конструкторе компонента подписываюсь так:export class MyComponent { testModel: TestModel; testModelService: TestModelService; constructor(@Inject(TestModelService) testModelService) { this.testModelService = testModelService; testService.fetchModel("29f4fddc-155a-4f26-9db6-5a431ecd5d44").subscribe( data => { this.testModel = FactModel.fromJson(JSON.parse(data)); }, err => console.log(err) ); } } Это работает, если объект поступает с сервера, но я пытаюсь создать наблюдаемый объект, который будет работать с заданным вызовом subscribe () для статической строки (это происходит, когда testModelService.fetchModel () не получает uuid), поэтому в обоих случаях обработка выполняется без проблем.
M

Michail Michailidis

6 лет назад

Ответов: 6

Синтаксис для асинхронной стрелочной функции

Я могу пометить функцию JavaScript как «асинхронную» (т.е. возвращающую обещание) с помощью ключевого слова async. Как это:async function foo() { // Do something } Каков эквивалентный синтаксис для стрелочных функций?
B

BonsaiOak

5 лет назад

Ответов: 8

Использование async / await с циклом forEach

Есть ли проблемы с использованием async/await в цикле forEach? Я пытаюсь перебрать массив файлов и await для содержимого каждого файла.import fs from 'fs-promise' async function printFiles () { const files = await getFilePaths() // Assume this works fine files.forEach(async (file) => { const contents = await fs.readFile(file, 'utf8') console.log(contents) }) } printFiles() Этот код работает, но может что-то с этим не так? Кто-то сказал мне, что вы не должны использовать async/await в такой функции высшего порядка, как эта, поэтому я просто хотел спросить, есть ли проблема с этим .
S

Saad

6 лет назад

Ответов: 29

Есть ли еще причины использовать библиотеки обещаний, такие как Q или BlueBird, теперь, когда у нас есть обещания ES6?

После того, как в Node.js была добавлена ​​встроенная поддержка обещаний, остались ли причины использовать такие библиотеки, как Q или BlueBird?Например, если вы начинаете новый проект и предположим, что в этом проекте у вас нет никаких зависимостей, использующих эти библиотеки, можем ли мы сказать, что действительно больше нет причин использовать такие библиотеки?
M

Murat Ozgul

6 лет назад

Ответов: 1

В чем разница между обещаниями и наблюдаемыми?

В чем разница между Promise и Observable в Angular?Примеры каждого из них помогут понять оба случая. В каком сценарии мы можем использовать каждый случай?
R

Rohit

6 лет назад

Ответов: 31

Можно ли передать асинхронную функцию в setImmediate, чтобы вызвать произвольную функцию асинхронно?

Я хочу вызвать заданную функцию асинхронно. Функция-обертка tryCallAsync - один из способов сделать это. Этот подход работает. Однако он требует, чтобы обратный вызов для setImmediate был асинхронной функцией. Это кажется неправильным, поскольку обратный вызов возвращает Promise, который не используется. Разве неправильно передавать асинхронную функцию в setImmediate для этой цели? async function tryCallAsync(fn, ...args) { return new Promise((r, j) => { setImmediate(async () => { try { r(await fn(...args)); } catch (e) { j(e); } }) }) } // Using tryCallAsync let resolveAsync = tryCallAsync(()=>{ return new Promise((r,j)=>{ setImmediate(()=>r('resolveAsync')); }); }) resolveAsync.then((resolve)=>console.log(resolve)); let resolve = tryCallAsync(()=>{ return 'resolve'; }); resolve.then((resolve)=>console.log(resolve)); NB: https://www.youtube.com/watch?v=e3Nh350b6S4
s

stackhatter

год назад

Ответов: 2

2022 WebDevInsider