异步

  虽然 JS 是异步执行的语言,但是人的思维是同步的————因此,开发者总是在寻求如何使用逻辑上看似同步的代码来完成 JS 的异步请求。目前,开发人员已经给出了解决异步的成熟可行的方案,那就是Promise,并进一步提出了基于Promise的async函数。

Promise

  Promise可以实现其他语言中类似Future和Deferred一样的功能,它既可以像事件和回调函数一样指定稍后执行的代码,也可以明确指示代码是否成功执行。基于这些成功或失败的状态,决定代码是否继续执行。为了让代码更容易理解和调试,支持链式地编写Promise。

Promise的生命周期
  每个Promise都会经历一个短暂的生命周期:先是处于进行中(pending)的状态,此时操作尚未完成,所以它也是未处理(unsettled)的;一旦异步操作执行结束,Promise则变为已处理(settled)的状态,fulfilled标志Promise异步操作成功完成,rejected标志由于程序错误或一些其他原因,Promise异步操作未能成功。
  内部属性[[PromiseState]]被用来表示Promise的3种状态:pending、fulfilled及rejected。这个属性不暴露在Promise对象上,所以不能以编程的方式检测Promise的状态,当Promise的状态改变时,then()方法会采取特定的行动。

then

  所有Promise都有then()方法,它接受两个参数:
  第一个是当Promise的状态变为fulfilled时要调用的函数,与异步操作相关的附加数据都会传递给这个完成函数。
  第二个是当Promise的状态变为rejected时要调用的函数,其与完成时调用的函数类似,所有与失败状态相关的附加数据都会传递给这个拒绝函数。
  then()的两个参数都是可选的,所以可以按照任意组合的方式来监听Promise,执行完成或被拒绝都会被响应。

let promise = readFile("example.txt");
promise.then(function(contents) {  // 同时监听了执行完成和执行被拒;
    // 完成
    console.log(contents);
}, function(err) {
    // 拒绝
    console.error(err.message);
});
promise.then(function(contents) { // 只监听了执行完成,错误时不报告
    // 完成
    console.log(contents);
});
promise.then(null, function(err) { // 只监听了执行被拒,成功时不报告
    // 拒绝
    console.error(err.message);
});

  如果一个对象实现了上述的then()方法,那这个对象我们称之为thenable对象。所有的Promise都是thenable对象,但并非所有thenable对象都是Promise。

  Promise还有一个catch()方法,相当于只给其传入拒绝处理程序的then()方法。

promise.catch(function(err) {
    // 拒绝
    console.error(err.message);
});
// 等同于:
promise.then(null, function(err) {
    // 拒绝
    console.error(err.message);
});

  如果一个Promise处于己处理状态,在这之后添加到任务队列中的处理程序仍将执行。所以无论何时都可以添加新的完成处理程序或拒绝处理程序,同时也可以保证这些处理程序能被调用。

let promise = readFile("example.txt");
    // 原始的完成处理函数
    promise.then(function(contents) {
        console.log(contents);
        // 现在添加另一个
        promise.then(function(contents) {
            console.log(contents);
        });
});
创建未处理的Promise

  用Promise构造函数可以创建新的Promise,构造函数只接受一个参数:包含初始化Promise代码的执行器(executor)函数。执行器接受两个参数,分别是resolve()函数和reject()函数。执行器成功完成时调用resolve()函数,反之,失败时则调用reject()函数。

// Node.js 范例
let fs = require("fs");
function readFile(filename) {
    return new Promise(function(resolve, reject) {
        // 触发异步操作
        fs.readFile(filename, { encoding: "utf8" }, function(err, contents) {
            // 检查错误
            if (err) {
                reject(err);
                return;
            }
            // 读取成功
            resolve(contents);
        });
    });
}
let promise = readFile("example.txt");
// 同时监听完成与拒绝
promise.then(function(contents) {
    // 完成
    console.log(contents);
}, function(err) {
    // 拒绝
    console.error(err.message);
});

  readFile()方法被调用时执行器会立刻执行,在执行器中,无论是调用resolve()还是reject(),都会向任务队列中添加一个任务来解决这个Promise。

let promise = new Promise(function(resolve, reject) {
    console.log("Promise");
    resolve();
});
console.log("Hi!");

  这段代码的输出内容是

promise
Hi !

  调用resolve()后会触发一个异步操作,传入then()和catch()方法的函数会被添加到任务队列中并异步执行。

let promise = new Promise(function(resolve, reject) {
    console.log("Promise");
    resolve();
});
promise.then(function() {
    console.log("Resolved.");
});
console.log("Hi!");

  这个示例的输出内容为

promise
Hi !
Resolved

  即使在代码中then()调用位于console.log("Hi!")之前,但其与执行器不同,它并没有立即执行。这是因为,完成处理程序和拒绝处理程序总是在执行器完成后被添加到任务队列的末尾。

创建已处理的Promise

  创建未处理Promise的最好方法是使用Promise的构造函数,这是由于Promise执行器具有动态性。但如果想用Promise来表示一个已知值,则编排一个只是简单地给resolve()函数传值的任务并无实际意义,反倒是可以用以下两种方法根据特定的值来创建己解决Promise。
  Promise.resolve()方法只接受一个参数并返回一个完成态的Promise,也就是说不会有任务编排的过程,而且需要向Promise添加一至多个完成处理程序来获取值。

let promise = Promise.resolve(42);
promise.then(function(value) {
    console.log(value); // 42
});

  同理也可以通过Promise.reject()方法来创建已拒绝态的Promise,它与Promise.resolve()很像,唯一的区别是创建出来的是拒绝态的Promise。

非Promise的Thenable对象

  Promise.resolve()方法和Promise.reject()方法都可以接受非Promise的Thenable对象作为参数。如果传入一个非Promise的Thenable对象,则这些方法会创建一个新的Promise,并在then()函数中被调用。

let thenable = {
    then: function(resolve, reject) {
        resolve(42);
    }
};
let p1 = Promise.resolve(thenable);
p1.then(function(value) {
    console.log(value); // 42
});

  在此示例中,Promise.resolve()调用的是thenable.then(),所以Promise的状态可以被检测到。由于是在then()方法内部调用了resolve(42),因此thenable对象的Promise状态是已完成。新创建的已完成状态Promise p1从thenable对象接受传入的值(也就是42),p1的完成处理程序将42赋值给形参value。

执行器错误

  如果执行器内部抛出一个错误,则Promise的拒绝处理程序就会被调用。

let promise = new Promise(function(resolve, reject) {
    throw new Error("Explosion!");
});
promise.catch(function(error) {
    console.log(error.message); // "Explosion!"
});
串联

  每次调用then()方法或catch()方法时实际上创建并返回了另一个Promise,只有当第一个Promise完成或被拒绝后,第二个才会被解决。

let p1 = new Promise(function(resolve, reject) {
    resolve(42);
});
p1.then(function(value) {
    console.log(value);
}).then(function() {
    console.log("Finished");
});

  这段代码输出以下内容:

42
Finished
捕获错误

  在之前的示例中,完成处理程序或拒绝处理程序中可能发生错误,而Promise链可以用来捕获这些错误。

let p1 = new Promise(function(resolve, reject) {
    throw new Error("Explosion!");
});
p1.catch(function(error) {
    console.log(error.message); // "Explosion!"
    throw new Error("Boom!");
}).catch(function(error) {
    console.log(error.message); // "Boom!"
});

  链式Promise调用可以感知到链中其他Promise的错误。

Promise链的返回值

  Promise链的另一个重要特性是可以给下游Promise传递数据,已经知道了从执行器resolve()处理程序到Promise完成处理程序的数据传递过程,如果在完成处理程序中指定一个返回值,则可以沿着这条链继续传递数据。

let p1 = new Promise(function(resolve, reject) {
    resolve(42);
});
p1.then(function(value) {
    console.log(value); // "42"
    return value + 1;
}).then(function(value) {
    console.log(value); // "43"
});

  在拒绝处理程序中也可以做相同的事情,当它被调用时可以返回一个值,然后用这个值完成链条中后续的Promise。

let p1 = new Promise(function(resolve, reject) {
    reject(42);
});
p1.catch(function(value) {
    // 第一个完成处理函数
    console.log(value); // "42"
    return value + 1;
}).then(function(value) {
    // 第二个完成处理函数
    console.log(value); // "43"
});
在Promise链中返回Promise

  在Promise间可以通过完成和拒绝处理程序中返回的原始值来传递数据,但如果返回的是Promise对象,会通过一个额外的步骤来确定下一步怎么走。

let p1 = new Promise(function(resolve, reject) {
    resolve(42);
});
let p2 = new Promise(function(resolve, reject) {
    resolve(43);
});
p1.then(function(value) {
    // 第一个完成处理函数
    console.log(value); // 42
    return p2;
}).then(function(value) {
    // 第二个完成处理函数
    console.log(value); // 43
});
let p1 = new Promise(function(resolve, reject) {
    resolve(42);
});
let p2 = new Promise(function(resolve, reject) {
    reject(43);
});
p1.then(function(value) {
    // 第一个完成处理函数
    console.log(value); // 42
    return p2;
}).catch(function(value) {
    // 拒绝处理函数
    console.log(value); // 43
});
Promise.all()

  在Promise.all()方法只接受一个参数并返回一个Promise,该参数是一个含有多个受监视Promise的可迭代对象(如一个数组),只有当可迭代对象中所有Promise都被解决后返回的Promise才会被解决,只有当可迭代对象中所有Promise都被完成后返回的Promise才会被完成。

let p1 = new Promise(function(resolve, reject) {
    resolve(42);
});
let p2 = new Promise(function(resolve, reject) {
    resolve(43);
});
let p3 = new Promise(function(resolve, reject) {
    resolve(44);
});
let p4 = Promise.all([p1, p2, p3]);
p4.then(function(value) {
    console.log(Array.isArray(value)); // true
    console.log(value[0]); // 42
    console.log(value[1]); // 43
    console.log(value[2]); // 44
});

  所有传入Promise.all()方法的Promise只要有一个被拒绝,那么返回的Promise没等所有Promise都完成就立即被拒绝。

Promise.race()

  Promise.race()方法监听多个Promise的方法稍有不同:它也接受含多个受监视Promise的可迭代对象作为唯一参数并返回一个Promise,但只要有一个Promise被解决返回的Promise就被解决,无须等到所有Promise都被完成。一旦数组中的某个Promise被完成,Promise.race()方法也会像Promise.all()方法一样返回一个特定的Promise。

let p1 = Promise.resolve(42);
let p2 = new Promise(function(resolve, reject) {
    resolve(43);
});
let p3 = new Promise(function(resolve, reject) {
    resolve(44);
});
let p4 = Promise.race([p1, p2, p3]);
p4.then(function(value) {
    console.log(value); // 42
});
Generator

  在 ES6 出现之前,基本都是各式各样类似Promise的解决方案来处理异步操作的代码逻辑,ES6 的Generator却给异步操作又提供了新的思路,马上就有人给出了如何用Generator来更加优雅的处理异步操作,但Generator函数的执行必须靠执行器,要配合co模块使用,而ES2017给出了另一个更优雅的解决方案async函数。
  async 函数是 Generator 函数的语法糖,该函数自带执行器,拥有更好的语义、更广的适用性。async函数的await命令后面,可以是Promise 对象和原始类型的值(数值、字符串和布尔值),async函数的返回值是 Promise 对象,这比 Generator 函数的返回值是 Iterator 对象方便多了。
  总之,在解决JS异步的问题上,相比于async,Generato显得既笨拙又复杂,本文将不再讨论Generator的使用。

async函数

  async函数返回一个 Promise 对象,可以使用then方法添加回调函数。当函数执行的时候,一旦遇到await就会先返回,等到异步操作完成,再接着执行函数体内后面的语句。

function timeout(ms) {
  return new Promise((resolve) => {
    setTimeout(resolve, ms);
  });
}

async function asyncPrint(value, ms) {
  await timeout(ms);
  console.log(value);
}

asyncPrint('hello world', 50);

  上面代码指定50毫秒以后,输出hello world。

async 函数有多种使用形式

// 函数声明
async function foo() {}

// 函数表达式
const foo = async function () {};

// 对象的方法
let obj = { async foo() {} };
obj.foo().then(...)

// Class 的方法
class Storage {
  constructor() {
    this.cachePromise = caches.open('avatars');
  }

  async getAvatar(name) {
    const cache = await this.cachePromise;
    return cache.match(`/avatars/${name}.jpg`);
  }
}

const storage = new Storage();
storage.getAvatar('jake').then(…);

// 箭头函数
const foo = async () => {};

语法
  async函数返回一个 Promise 对象,async函数内部return语句返回的值,会成为then方法回调函数的参数。

async function f() {
  return 'hello world';
}

f().then(v => console.log(v))
// "hello world"
async function f() {
  throw new Error('出错了');
}

f().then(
  v => console.log(v),
  e => console.log(e)
)
// Error: 出错了

Promise 对象的状态变化
  async函数返回的 Promise 对象,必须等到内部所有await命令后面的 Promise 对象执行完,才会发生状态改变,除非遇到return语句或者抛出错误。也就是说,只有async函数内部的异步操作执行完,才会执行then方法指定的回调函数。

async function getTitle(url) {
  let response = await fetch(url);
  let html = await response.text();
  return html.match(/([\s\S]+)<\/title>/i)[1];
}
getTitle('https://tc39.github.io/ecma262/').then(console.log)
// "ECMAScript 2018 Language Specification"
</code></pre> 
 <p>  上面代码中,函数getTitle内部有三个操作:抓取网页、取出文本、匹配页面标题。只有这三个操作全部完成,才会执行then方法里面的console.log。</p> 
 <p><strong>await命令</strong><br>   正常情况下,await命令后面是一个 Promise 对象。如果不是,会被转成一个立即resolve的 Promise 对象。</p> 
 <pre><code>async function f() {
  return await 123;
}

f().then(v => console.log(v)) // 123
</code></pre> 
 <pre><code>async function f() {
  await Promise.reject('出错了');
}

f()
.then(v => console.log(v))
.catch(e => console.log(e))// 出错了
</code></pre> 
 <p>  只要一个await语句后面的 Promise 变为reject,那么整个async函数都会中断执行。</p> 
 <pre><code>async function f() {
  await Promise.reject('出错了');
  await Promise.resolve('hello world'); // 不会执行
}
</code></pre> 
 <p>  有时,希望即使前一个异步操作失败,也不要中断后面的异步操作。这时可以将第一个await放在try...catch结构里面,这样不管这个异步操作是否成功,第二个await都会执行。</p> 
 <pre><code>async function myFunction() {
  try {
    await somethingThatReturnsAPromise();
  } catch (err) {
    console.log(err);
  }
}

// 另一种写法

async function myFunction() {
  await somethingThatReturnsAPromise()
  .catch(function (err) {
    console.log(err);
  });
}
</code></pre> 
</article>
                            </div>
                        </div>
                    </div>
                    <!--PC和WAP自适应版-->
                    <div id="SOHUCS" sid="1183763277306503168"></div>
                    <script type="text/javascript" src="/views/front/js/chanyan.js"></script>
                    <!-- 文章页-底部 动态广告位 -->
                    <div class="youdao-fixed-ad" id="detail_ad_bottom"></div>
                </div>
                <div class="col-md-3">
                    <div class="row" id="ad">
                        <!-- 文章页-右侧1 动态广告位 -->
                        <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_1"> </div>
                        </div>
                        <!-- 文章页-右侧2 动态广告位 -->
                        <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_2"></div>
                        </div>
                        <!-- 文章页-右侧3 动态广告位 -->
                        <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_3"></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <div class="container">
        <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(异步)</h4>
        <div id="paradigm-article-related">
            <div class="recommend-post mb30">
                <ul class="widget-links">
                    <li><a href="/article/1882777259761266688.htm"
                           title="构建一个rust生产应用读书笔记四(实战6)" target="_blank">构建一个rust生产应用读书笔记四(实战6)</a>
                        <span class="text-muted">编码浪子</span>
<a class="tag" taget="_blank" href="/search/Rust%E5%AD%A6%E4%B9%A0/1.htm">Rust学习</a><a class="tag" taget="_blank" href="/search/rust/1.htm">rust</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a><a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a>
                        <div>本节我们开始使用tracing来记录日志,实际上在生产环境中,更推荐使用tracing作为日志记录的首先,它提供了更丰富的上下文信息和结构化日志记录功能。tracing不仅可以记录日志信息,还可以跟踪函数调用、异步任务等,适用于复杂的分布式系统和微服务架构。添加配置依赖#Cargo.tomltracing="0.1.19"tracing-subscriber={version="0.3",feat</div>
                    </li>
                    <li><a href="/article/1882730719193657344.htm"
                           title="任务执行模式全解析:并发、并行、串行与同步、异步的对比" target="_blank">任务执行模式全解析:并发、并行、串行与同步、异步的对比</a>
                        <span class="text-muted">Nita.</span>
<a class="tag" taget="_blank" href="/search/%E5%B9%B6%E8%A1%8C%E7%BC%96%E7%A8%8B/1.htm">并行编程</a><a class="tag" taget="_blank" href="/search/C%23/1.htm">C#</a><a class="tag" taget="_blank" href="/search/%E5%B9%B6%E8%A1%8C%E7%BC%96%E7%A8%8B/1.htm">并行编程</a>
                        <div>目录1.并发(Concurrent)、并行(Parallel)、串行(Serial)1.1并行(Parallel)1.2并发(Concurrent)1.3并发与并行的区别1.4串行(Serial)2.同步(Synchronous)与异步(Asynchronous)2.1同步(Synchronous)2.2异步(Asynchronous)2.3同步与异步的区别3.并行编程和异步编程3.1区别3.2实</div>
                    </li>
                    <li><a href="/article/1882703100301602816.htm"
                           title="doris:Azure Storage导入数据" target="_blank">doris:Azure Storage导入数据</a>
                        <span class="text-muted">向阳1218</span>
<a class="tag" taget="_blank" href="/search/azure/1.htm">azure</a><a class="tag" taget="_blank" href="/search/flask/1.htm">flask</a><a class="tag" taget="_blank" href="/search/microsoft/1.htm">microsoft</a><a class="tag" taget="_blank" href="/search/doris/1.htm">doris</a>
                        <div>Doris提供两种方式从AzureStorage导入文件:使用S3Load将AzureStorage文件导入到Doris中,这是一个异步的导入方式。使用TVF将AzureStorage文件导入到Doris中,这是一个同步的导入方式。使用S3Load导入使用S3Load导入对象存储上的文件,详细步骤可以参考BrokerLoad手册第1步:准备数据创建CSV文件s3load_example.csv文件</div>
                    </li>
                    <li><a href="/article/1882690360484884480.htm"
                           title="如何部署 Flask 应用程序到生产环境?" target="_blank">如何部署 Flask 应用程序到生产环境?</a>
                        <span class="text-muted">Channing Lewis</span>
<a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/flask/1.htm">flask</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a>
                        <div>在生产环境中部署Flask应用程序需要考虑稳定性、安全性、可扩展性和性能。以下是Flask应用的常见生产部署方法及最佳实践:1.选择部署方式常见的Flask生产环境部署方式包括:部署方式适用场景说明Gunicorn+Nginx适合中小型项目轻量级,性能稳定uWSGI+Nginx高性能并发、生产环境推荐生产级别,支持异步工作Docker+Kubernetes容器化部署,微服务架构适合大规模微服务集群</div>
                    </li>
                    <li><a href="/article/1882684565487677440.htm"
                           title="Node.js的解释" target="_blank">Node.js的解释</a>
                        <span class="text-muted">web15085415935</span>
<a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0%E8%B7%AF%E7%BA%BF/1.htm">学习路线</a><a class="tag" taget="_blank" href="/search/%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4/1.htm">阿里巴巴</a><a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a>
                        <div>1.Node.js入门教程1.1什么是Node.js?1.1.1Node.js是什么?Node.js是一个基于JavaScript的开源服务器端运行时环境,允许开发者用JavaScript编写服务器端代码。与传统的前端JavaScript主要运行在浏览器端不同,Node.js通过提供一个非阻塞的异步模型,允许开发者在服务器端创建高性能的网络应用程序。比喻:想象你把JavaScript看作是一个厨师</div>
                    </li>
                    <li><a href="/article/1882596171856277504.htm"
                           title="JavaScript语法特性篇-动态导入 import()" target="_blank">JavaScript语法特性篇-动态导入 import()</a>
                        <span class="text-muted">前端后花园</span>
<a class="tag" taget="_blank" href="/search/JS%E5%AD%A6%E4%B9%A0%E8%B5%84%E6%96%99/1.htm">JS学习资料</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E5%8A%A8%E6%80%81%E5%AF%BC%E5%85%A5/1.htm">动态导入</a><a class="tag" taget="_blank" href="/search/%E9%9D%99%E6%80%81%E5%AF%BC%E5%85%A5/1.htm">静态导入</a><a class="tag" taget="_blank" href="/search/import/1.htm">import</a>
                        <div>1、基本使用import()语法,通常被称为动态导入,是一个类似函数的表达式,它允许异步和动态地将ECMAScript模块加载到一个可能不是模块的环境中。与声明式的导入相对应,动态导入只在需要时进行计算,并且允许更大的语法灵活性。简单来说,使用import()语法,你可以在运行时(而不是在编译时)决定要导入哪个模块,并且这种导入是异步的,不会阻塞代码的执行。awaitimport('/module</div>
                    </li>
                    <li><a href="/article/1882532347157475328.htm"
                           title="转载——关于C#延时" target="_blank">转载——关于C#延时</a>
                        <span class="text-muted">weixin_30875157</span>
<a class="tag" taget="_blank" href="/search/c%23/1.htm">c#</a>
                        <div>c#里的延时方法:1.用sleep()使线程休眠。直接在需要延时的地方插入System.Threading.Thread.Sleep(1000);即可。这种方式最方便,但是延时过程中会停止其他响应,如果用在主线程中会造成程序的假死。如果有异步操作的话也会暂停,例如用webBrowser加载网页,本来希望延时一段时间等待网页加载完毕,但用sleep的话同时会暂停网页的加载过程。2.读取当前时间判断。</div>
                    </li>
                    <li><a href="/article/1882518946091954176.htm"
                           title="【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error" target="_blank">【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error</a>
                        <span class="text-muted">egzosn</span>
<a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/ecmascript/1.htm">ecmascript</a>
                        <div>在前端开发中,JavaScript异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如Promise、async/await等),开发者常常会遇到Uncaught(inpromise)error错误。这个错误是由于未正确处理Promise的拒绝(rejection)而导致的,常常出现在异步操作失败的情况下。如果不妥善处理,可能会导致应用的不稳定和用户体验的下降。本文将深入分析Uncaugh</div>
                    </li>
                    <li><a href="/article/1882518721902211072.htm"
                           title="【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error" target="_blank">【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error</a>
                        <span class="text-muted">egzosn</span>
<a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/ecmascript/1.htm">ecmascript</a>
                        <div>在前端开发中,JavaScript异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如Promise、async/await等),开发者常常会遇到Uncaught(inpromise)error错误。这个错误是由于未正确处理Promise的拒绝(rejection)而导致的,常常出现在异步操作失败的情况下。如果不妥善处理,可能会导致应用的不稳定和用户体验的下降。本文将深入分析Uncaugh</div>
                    </li>
                    <li><a href="/article/1882507889562677248.htm"
                           title="Python异步: 什么时候使用异步?" target="_blank">Python异步: 什么时候使用异步?</a>
                        <span class="text-muted"></span>
<a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AFpython/1.htm">后端python</a>
                        <div>从广义上讲,Asyncio是新的、流行的、讨论广泛的和令人兴奋的。然而,对于何时应该在项目中采用它存在很多困惑。我们什么时候应该在Python中使用asyncio?在Python中使用Asyncio的原因在Python项目中使用asyncio可能有3个原因:使用asyncio以便在您的程序中采用协程。使用asyncio以使用异步编程范例。使用asyncio以使用非阻塞I/O。1.1.使用协程我们可</div>
                    </li>
                    <li><a href="/article/1882507756427079680.htm"
                           title="async++库的使用示例" target="_blank">async++库的使用示例</a>
                        <span class="text-muted">哎呦,帅小伙哦</span>
<a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/async%2B%2B/1.htm">async++</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/async%2B%2B/1.htm">async++</a>
                        <div>1、普通异步函数如前面的博客介绍的,这个库中提供了async::spawn方法,这个方法通常用来启动异步函数,这个框架会利用线程池去完成函数,因此要注意数据安全。正因为将任务放到了单独的线程执行,并且还有调度开销,因此简单的任务最好不要使用这种方法,得不偿失。示例代码如下:voiddemo_async1(){std::mutexmutex;autotask1=async::spawn([&mute</div>
                    </li>
                    <li><a href="/article/1882480650464849920.htm"
                           title="C#中的委托和事件" target="_blank">C#中的委托和事件</a>
                        <span class="text-muted">190043</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a>
                        <div>委托委托(Delegate)是C#中一种特殊的类型,它用于封装方法的引用。委托可以看作是类型安全的函数指针,允许你将方法作为参数传递给其他方法、从方法返回方法或者存储在变量中以备后用。委托在事件处理、回调函数和异步编程等场景中非常有用。委托的基本概念定义委托:首先需要定义一个委托类型,指定它可以引用的方法签名(包括返回类型和参数列表)。实例化委托:然后创建该委托类型的实例,并将其与具体的方法关联起</div>
                    </li>
                    <li><a href="/article/1882420255150632960.htm"
                           title="spring webflux" target="_blank">spring webflux</a>
                        <span class="text-muted">蓝天星空</span>
<a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B/1.htm">编程</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a>
                        <div>SpringWebFlux是Spring框架中用于构建响应式(reactive)Web应用的模块。它基于反应式编程模型,旨在提供一种非阻塞、事件驱动的编程方式,以应对高并发和低延迟的需求。以下是SpringWebFlux的主要特点和组成部分:###主要特点1.**非阻塞和异步**:-SpringWebFlux使用非阻塞的I/O操作,能够在高并发情况下保持高性能。-支持异步编程模型,使得应用程序能够</div>
                    </li>
                    <li><a href="/article/1882359864458539008.htm"
                           title="【Python】高效的Web自动化测试利器—Python+Playwright快速上手自动化实战指南" target="_blank">【Python】高效的Web自动化测试利器—Python+Playwright快速上手自动化实战指南</a>
                        <span class="text-muted">墩墩分墩</span>
<a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/1.htm">自动化测试</a><a class="tag" taget="_blank" href="/search/playwright/1.htm">playwright</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/UI%E8%87%AA%E5%8A%A8%E5%8C%96/1.htm">UI自动化</a>
                        <div>文章目录前言一.playwright是什么二.python引入playwright1.安装2.playwright命令行参数3.playwrightcodegen自动生成代码4.Chrome和Chromium有什么关系?三.基本概念1.无头浏览器(HeadlessBrowser)2.同步和异步模式操作playwright2.1.同步(Sync)模式同步方式代码模板2.2.异步(Async)模式异步</div>
                    </li>
                    <li><a href="/article/1882309312097873920.htm"
                           title="RocketMQ介绍与应用场景" target="_blank">RocketMQ介绍与应用场景</a>
                        <span class="text-muted">我心向阳iu</span>
<a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/RocketMQ/1.htm">RocketMQ</a><a class="tag" taget="_blank" href="/search/Java%E9%9D%A2%E8%AF%95%E7%9F%A5%E8%AF%86%E7%82%B9%E7%B2%BE%E8%AE%B2/1.htm">Java面试知识点精讲</a><a class="tag" taget="_blank" href="/search/java-rocketmq/1.htm">java-rocketmq</a><a class="tag" taget="_blank" href="/search/rocketmq/1.htm">rocketmq</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                        <div>文章目录1.RocketMQ介绍1.1RocketMQ介绍1.2MQ的主要应用场景1.3MQ的应用场景举例1、限流削峰1、任务异步处理。3、应用程序解耦合4、日志收集:1.4消息队列技术选型对比1.3.1主流消息队列优缺点比较1.RocketMQ介绍1.1RocketMQ介绍RocketMQ是阿里开源的一款非常优秀中间件产品,脱胎于阿里的另一款队列技术MetaQ,后捐赠给Apache基金会作为一款</div>
                    </li>
                    <li><a href="/article/1882279697346260992.htm"
                           title="react数据异步更新" target="_blank">react数据异步更新</a>
                        <span class="text-muted">wlt_5079</span>
<a class="tag" taget="_blank" href="/search/react.js/1.htm">react.js</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a>
                        <div>1.react数据异步更新定义一个类组件模板:classMyComextendsReact.Component{}设置state状态数据:state={name:"张三"}render()渲染函数:render(){return{this.state.name}}过程:this打点调用自定义函数change绑定click事件,返回一个button按钮,通过this.state打点调用自定义属性na</div>
                    </li>
                    <li><a href="/article/1882276168795746304.htm"
                           title="react16版本之后开发中的注意点之setState异步" target="_blank">react16版本之后开发中的注意点之setState异步</a>
                        <span class="text-muted">_云淡风轻_</span>
<a class="tag" taget="_blank" href="/search/react/1.htm">react</a>
                        <div>setState(setState底层为异步的原因)防止短时间内多次修改setState影响虚拟dom的比对及render方法的执行。因此,setState是异步函数。那么及时获取state数据就要在异步函数执行完毕而非按照代码从上到下的执行来获取。如:state={inputValue:"12"};this.setState((prevState)=>({inputValue:''}),()=></div>
                    </li>
                    <li><a href="/article/1882271127225561088.htm"
                           title="redux中action的异步更新state踩坑1" target="_blank">redux中action的异步更新state踩坑1</a>
                        <span class="text-muted">尼古拉斯二嘎</span>
<a class="tag" taget="_blank" href="/search/react/1.htm">react</a>
                        <div>reducer的异步更新state引发的问题以及处理方案有些需求比如:我们想在接口请求完成后立即获取state的状态,然后去做路由跳转等等操作,但是redux中action操作的state都是异步的,怎么办呢?下面我们看一个例子在组件中我们想点击后立即获取到state状态然后再跳转:importReact,{Component}from'react'import{connect}from'reac</div>
                    </li>
                    <li><a href="/article/1882268099323949056.htm"
                           title="watch里可以写异步吗" target="_blank">watch里可以写异步吗</a>
                        <span class="text-muted">每天吃饭的羊</span>
<a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a>
                        <div>在Vue的watch中可以写异步,但通常不推荐。原因-可维护性差:watch的主要用途是响应式地监听数据变化。如果在里面写复杂的异步操作,会让代码逻辑变得难以理解和维护。例如,同时监听多个数据变化并触发不同异步操作时,代码会很混乱。-数据更新问题:异步操作可能会导致数据更新不及时或不一致。watch在数据变化后就会触发,但是异步任务有延迟,在这个延迟期间数据可能已经被其他操作修改了,就容易出现问题</div>
                    </li>
                    <li><a href="/article/1882264691162542080.htm"
                           title="解决redux中state更新是异步的问题" target="_blank">解决redux中state更新是异步的问题</a>
                        <span class="text-muted">_Kay_</span>
<a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/react/1.htm">react</a><a class="tag" taget="_blank" href="/search/redux/1.htm">redux</a>
                        <div>在开发的过程中突然发现了一个非常诡异的问题,伪代码如下:this.props.dispatch(updateData(value))//1console.log(this.props.data)//2状态没有更新setTimeout(()=>//3状态发生了更新)于是猜想redux执行action应该是同步的,但是reducer中将新状态返回更新store数据仓库的过程应该是异步的.所以当上面1处</div>
                    </li>
                    <li><a href="/article/1882241238527176704.htm"
                           title="后端开发基础——JavaWeb(根基,了解原理)浓缩" target="_blank">后端开发基础——JavaWeb(根基,了解原理)浓缩</a>
                        <span class="text-muted">Wanna715</span>
<a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF%E5%BC%80%E5%8F%91%E5%9F%BA%E7%A1%80/1.htm">后端开发基础</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/tomcat/1.htm">tomcat</a><a class="tag" taget="_blank" href="/search/servlet/1.htm">servlet</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a>
                        <div>总述学习Tomcat、JSON、Servlet、Filter、Session、Cookie、Ajax异步请求、RESTful接口规范、JSP(很老的技术,了解)Servlet系统架构C/S架构(Client/Server(客户端/服务器))B/S架构(Browser/Server,浏览器/服务器)javaJavaSE:Java标准版JavaEE:企业版(WEB方向,WEB系统)13种规范,其中Se</div>
                    </li>
                    <li><a href="/article/1882230138972729344.htm"
                           title="kotlin的协程的基础概念" target="_blank">kotlin的协程的基础概念</a>
                        <span class="text-muted">小李飞飞砖</span>
<a class="tag" taget="_blank" href="/search/kotlin/1.htm">kotlin</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>Kotlin的协程是一种用于简化异步编程的强大工具。理解协程的基础概念可以帮助开发者有效地利用其能力。以下是Kotlin协程的一些关键基础概念:协程(Coroutines):协程是一种用于处理并发任务的编程模型,它可以在单个线程内执行异步任务。与传统的线程相比,协程更加轻量级,可以高效地执行大量并发任务。挂起函数(SuspendFunctions):使用suspend关键字定义的函数,可以在不阻塞</div>
                    </li>
                    <li><a href="/article/1882205286165442560.htm"
                           title="kotlin协程使用举例" target="_blank">kotlin协程使用举例</a>
                        <span class="text-muted">小李飞飞砖</span>
<a class="tag" taget="_blank" href="/search/kotlin/1.htm">kotlin</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a>
                        <div>Kotlin协程通过简化异步任务的处理,使代码更易于阅读和维护。以下是一些常见的使用场景及代码示例,展示如何使用Kotlin协程:1.启动一个简单的协程使用launch在协程作用域内启动一个协程。importkotlinx.coroutines.*funmain()=runBlocking{launch{delay(1000L)//模拟一些异步工作println("World!")}println</div>
                    </li>
                    <li><a href="/article/1882205286656176128.htm"
                           title="Kotlin协程中withContext、async 和 launch 的区别" target="_blank">Kotlin协程中withContext、async 和 launch 的区别</a>
                        <span class="text-muted">小李飞飞砖</span>
<a class="tag" taget="_blank" href="/search/kotlin/1.htm">kotlin</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a>
                        <div>文章目录一、withContext、async和launch对比1.withContext2.async3.launch总结对比任务启动:适用情境:二、为何说withContext是顺序执行1.挂起协程但不创建新协程2.顺序流程的保证3.用例场景的体现结论withContext、async和launch是Kotlin协程库中用来管理并发和异步任务的三个不同的构建器。它们适用于不同的场景,具有不同的</div>
                    </li>
                    <li><a href="/article/1882189900829224960.htm"
                           title="Kafka 入门与应用实战:吞吐量优化与与 RabbitMQ、RocketMQ 的对比" target="_blank">Kafka 入门与应用实战:吞吐量优化与与 RabbitMQ、RocketMQ 的对比</a>
                        <span class="text-muted">小白的一叶扁舟</span>
<a class="tag" taget="_blank" href="/search/Java%E5%BC%80%E5%8F%91/1.htm">Java开发</a><a class="tag" taget="_blank" href="/search/kafka/1.htm">kafka</a><a class="tag" taget="_blank" href="/search/rabbitmq/1.htm">rabbitmq</a><a class="tag" taget="_blank" href="/search/rocketmq/1.htm">rocketmq</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                        <div>前言在现代微服务架构和分布式系统中,消息队列作为解耦组件,承担着重要的职责。它不仅提供了异步处理的能力,还能确保系统的高可用性、容错性和扩展性。常见的消息队列包括Kafka、RabbitMQ和RocketMQ,其中Kafka因其高吞吐量、分布式特性和可靠性成为大规模数据流处理的首选。本篇文章将深入介绍Kafka的基本概念、执行流程、吞吐量优化策略、生命周期,重点对比Kafka与RabbitMQ和R</div>
                    </li>
                    <li><a href="/article/1882179936865808384.htm"
                           title="Python Twisted" target="_blank">Python Twisted</a>
                        <span class="text-muted">weixin_33946605</span>
<a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a>
                        <div>Twsited异步网络框架Twisted是一个事件驱动的网络框架,其中包含了诸多功能,例如:网络协议、线程、数据库管理、网络操作、电子邮件等。事件驱动简而言之,事件驱动分为二个部分:第一,注册事件;第二,触发事件。例:程序一#!/usr/bin/envpython#-*-coding:utf-8-*-#event_drive.pyevent_list=[]defrun():  foreventin</div>
                    </li>
                    <li><a href="/article/1882129986391961600.htm"
                           title="2025年前端面试题汇总" target="_blank">2025年前端面试题汇总</a>
                        <span class="text-muted">涔溪</span>
<a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a>
                        <div>JavaScript核心异步编程Promise、async/await的工作原理及应用场景。如何处理并发请求,使用Promise.all()或Promise.race()等方法。解释事件循环机制,理解微任务(microtask)与宏任务(macrotask)的区别。原型链深入理解JavaScript中的原型继承模型。举例说明如何通过修改原型对象影响所有实例。闭包定义闭包及其作用,如实现私有变量和函</div>
                    </li>
                    <li><a href="/article/1882089123343298560.htm"
                           title="Spring Boot 集成 RabbitMQ" target="_blank">Spring Boot 集成 RabbitMQ</a>
                        <span class="text-muted">一叶飘零_sweeeet</span>
<a class="tag" taget="_blank" href="/search/MQ/1.htm">MQ</a><a class="tag" taget="_blank" href="/search/Springboot/1.htm">Springboot</a><a class="tag" taget="_blank" href="/search/%E6%9E%9C%E9%85%B1%E7%B4%AB/1.htm">果酱紫</a><a class="tag" taget="_blank" href="/search/java-rabbitmq/1.htm">java-rabbitmq</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/rabbitmq/1.htm">rabbitmq</a>
                        <div>在现代分布式系统中,消息队列扮演着至关重要的角色。它能够实现系统间的异步通信、解耦组件以及提高系统的可扩展性和可靠性。RabbitMQ作为一款广泛使用的开源消息中间件,具有强大的功能和灵活的配置。而SpringBoot则是一种流行的Java开发框架,能够快速构建应用程序。本文将详细介绍如何在SpringBoot项目中集成RabbitMQ,包括安装和配置RabbitMQ、在SpringBoot中使用</div>
                    </li>
                    <li><a href="/article/1882078784685928448.htm"
                           title="高效消息传递架构:基于 RabbitMQ 与 C# 实现分布式系统的异步通信与解耦" target="_blank">高效消息传递架构:基于 RabbitMQ 与 C# 实现分布式系统的异步通信与解耦</a>
                        <span class="text-muted">威哥说编程</span>
<a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a><a class="tag" taget="_blank" href="/search/rabbitmq/1.htm">rabbitmq</a>
                        <div>在现代分布式系统中,消息队列作为一种核心的通信机制,广泛应用于系统间的异步通信、解耦以及负载均衡等场景。特别是对于需要处理高吞吐量、低延迟和高度可扩展的应用,采用成熟的消息队列中间件如RabbitMQ,可以显著提高系统的可靠性、灵活性和可维护性。与C#结合使用时,开发者可以充分利用其强大的类型系统、丰富的库支持和异步编程能力,构建高效、响应快速的分布式系统架构。本文将深入探讨如何利用RabbitM</div>
                    </li>
                    <li><a href="/article/1882074619922411520.htm"
                           title="C#编程语言实践:基础知识与项目开发" target="_blank">C#编程语言实践:基础知识与项目开发</a>
                        <span class="text-muted">靠谱电竞</span>

                        <div>本文还有配套的精品资源,点击获取简介:C#是微软公司设计的面向对象编程语言,广泛应用于Windows桌面、游戏及Web应用开发。本课程深入探讨C#的基础知识、语法特性、面向对象编程、异常处理等概念,并涉及LINQ查询、异步编程、泛型、委托、事件、接口、匿名方法、Lambda表达式、.NET框架及C#最新版本的特性。此外,课程将介绍调试与性能优化技能,以及代码重构的重要性,以帮助学生建立扎实的C#编</div>
                    </li>
                                <li><a href="/article/108.htm"
                                       title="Nginx负载均衡" target="_blank">Nginx负载均衡</a>
                                    <span class="text-muted">510888780</span>
<a class="tag" taget="_blank" href="/search/nginx/1.htm">nginx</a><a class="tag" taget="_blank" href="/search/%E5%BA%94%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">应用服务器</a>
                                    <div>Nginx负载均衡一些基础知识: 
 
nginx 的 upstream目前支持 4 种方式的分配 
1)、轮询(默认) 
      每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。 
2)、weight 
      指定轮询几率,weight和访问比率成正比</div>
                                </li>
                                <li><a href="/article/235.htm"
                                       title="RedHat 6.4 安装 rabbitmq" target="_blank">RedHat 6.4 安装 rabbitmq</a>
                                    <span class="text-muted">bylijinnan</span>
<a class="tag" taget="_blank" href="/search/erlang/1.htm">erlang</a><a class="tag" taget="_blank" href="/search/rabbitmq/1.htm">rabbitmq</a><a class="tag" taget="_blank" href="/search/redhat/1.htm">redhat</a>
                                    <div>在 linux 下安装软件就是折腾,首先是测试机不能上外网要找运维开通,开通后发现测试机的 yum 不能使用于是又要配置 yum 源,最后安装 rabbitmq 时也尝试了两种方法最后才安装成功 
 
机器版本: 
 
[root@redhat1 rabbitmq]# lsb_release
LSB Version:    :base-4.0-amd64:base-4.0-noarch:core</div>
                                </li>
                                <li><a href="/article/362.htm"
                                       title="FilenameUtils工具类" target="_blank">FilenameUtils工具类</a>
                                    <span class="text-muted">eksliang</span>
<a class="tag" taget="_blank" href="/search/FilenameUtils/1.htm">FilenameUtils</a><a class="tag" taget="_blank" href="/search/common-io/1.htm">common-io</a>
                                    <div>转载请出自出处:http://eksliang.iteye.com/blog/2217081 一、概述 
这是一个Java操作文件的常用库,是Apache对java的IO包的封装,这里面有两个非常核心的类FilenameUtils跟FileUtils,其中FilenameUtils是对文件名操作的封装;FileUtils是文件封装,开发中对文件的操作,几乎都可以在这个框架里面找到。 非常的好用。 </div>
                                </li>
                                <li><a href="/article/489.htm"
                                       title="xml文件解析SAX" target="_blank">xml文件解析SAX</a>
                                    <span class="text-muted">不懂事的小屁孩</span>
<a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a>
                                    <div>xml文件解析:xml文件解析有四种方式, 
1.DOM生成和解析XML文档(SAX是基于事件流的解析) 
2.SAX生成和解析XML文档(基于XML文档树结构的解析) 
3.DOM4J生成和解析XML文档 
4.JDOM生成和解析XML  
本文章用第一种方法进行解析,使用android常用的DefaultHandler 
 
 
import org.xml.sax.Attributes;
</div>
                                </li>
                                <li><a href="/article/616.htm"
                                       title="通过定时任务执行mysql的定期删除和新建分区,此处是按日分区" target="_blank">通过定时任务执行mysql的定期删除和新建分区,此处是按日分区</a>
                                    <span class="text-muted">酷的飞上天空</span>
<a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a>
                                    <div>使用python脚本作为命令脚本,linux的定时任务来每天定时执行 
  
#!/usr/bin/python
# -*- coding: utf8 -*-
import pymysql
import datetime
import calendar

#要分区的表
table_name = 'my_table'
#连接数据库的信息
host,user,passwd,db = </div>
                                </li>
                                <li><a href="/article/743.htm"
                                       title="如何搭建数据湖架构?听听专家的意见" target="_blank">如何搭建数据湖架构?听听专家的意见</a>
                                    <span class="text-muted">蓝儿唯美</span>
<a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a>
                                    <div>Edo Interactive在几年前遇到一个大问题:公司使用交易数据来帮助零售商和餐馆进行个性化促销,但其数据仓库没有足够时间去处理所有的信用卡和借记卡交易数据 
 “我们要花费27小时来处理每日的数据量,”Edo主管基础设施和信息系统的高级副总裁Tim Garnto说道:“所以在2013年,我们放弃了现有的基于PostgreSQL的关系型数据库系统,使用了Hadoop集群作为公司的数</div>
                                </li>
                                <li><a href="/article/870.htm"
                                       title="spring学习——控制反转与依赖注入" target="_blank">spring学习——控制反转与依赖注入</a>
                                    <span class="text-muted">a-john</span>
<a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a>
                                    <div>       控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心。 控制反转一般分为两种类型,依赖注入(Dependency Injection,简称DI)和依赖查找(Dependency Lookup)。依赖注入应用比较广泛。 
  
</div>
                                </li>
                                <li><a href="/article/997.htm"
                                       title="用spool+unixshell生成文本文件的方法" target="_blank">用spool+unixshell生成文本文件的方法</a>
                                    <span class="text-muted">aijuans</span>
<a class="tag" taget="_blank" href="/search/xshell/1.htm">xshell</a>
                                    <div>例如我们把scott.dept表生成文本文件的语句写成dept.sql,内容如下:  
  set pages 50000; 
  set lines 200; 
  set trims on; 
  set heading off; 
  spool /oracle_backup/log/test/dept.lst; 
  select deptno||','||dname||','||loc </div>
                                </li>
                                <li><a href="/article/1124.htm"
                                       title="1、基础--名词解析(OOA/OOD/OOP)" target="_blank">1、基础--名词解析(OOA/OOD/OOP)</a>
                                    <span class="text-muted">asia007</span>
<a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/1.htm">学习基础知识</a>
                                    <div>OOA:Object-Oriented Analysis(面向对象分析方法) 
是在一个系统的开发过程中进行了系统业务调查以后,按照面向对象的思想来分析问题。OOA与结构化分析有较大的区别。OOA所强调的是在系统调查资料的基础上,针对OO方法所需要的素材进行的归类分析和整理,而不是对管理业务现状和方法的分析。 
  OOA(面向对象的分析)模型由5个层次(主题层、对象类层、结构层、属性层和服务层)</div>
                                </li>
                                <li><a href="/article/1251.htm"
                                       title="浅谈java转成json编码格式技术" target="_blank">浅谈java转成json编码格式技术</a>
                                    <span class="text-muted">百合不是茶</span>
<a class="tag" taget="_blank" href="/search/json%E7%BC%96%E7%A0%81/1.htm">json编码</a><a class="tag" taget="_blank" href="/search/java%E8%BD%AC%E6%88%90json%E7%BC%96%E7%A0%81/1.htm">java转成json编码</a>
                                    <div>json编码;是一个轻量级的数据存储和传输的语言 
   
   在java中需要引入json相关的包,引包方式在工程的lib下就可以了 
  
JSON与JAVA数据的转换(JSON 即 JavaScript Object Natation,它是一种轻量级的数据交换格式,非 
  
常适合于服务器与 JavaScript 之间的数据的交</div>
                                </li>
                                <li><a href="/article/1378.htm"
                                       title="web.xml之Spring配置(基于Spring+Struts+Ibatis)" target="_blank">web.xml之Spring配置(基于Spring+Struts+Ibatis)</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/web.xml/1.htm">web.xml</a><a class="tag" taget="_blank" href="/search/SSI/1.htm">SSI</a><a class="tag" taget="_blank" href="/search/spring%E9%85%8D%E7%BD%AE/1.htm">spring配置</a>
                                    <div>指定Spring配置文件位置 
<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>
			/WEB-INF/spring-dao-bean.xml,/WEB-INF/spring-resources.xml,
			/WEB-INF/</div>
                                </li>
                                <li><a href="/article/1505.htm"
                                       title="Installing SonarQube(Fail to download libraries from server)" target="_blank">Installing SonarQube(Fail to download libraries from server)</a>
                                    <span class="text-muted">sunjing</span>
<a class="tag" taget="_blank" href="/search/Install/1.htm">Install</a><a class="tag" taget="_blank" href="/search/Sonar/1.htm">Sonar</a>
                                    <div>1.  Download and unzip the SonarQube distribution  
2.  Starting the Web Server 
The default port is "9000" and the context path is "/". These values can be changed in &l</div>
                                </li>
                                <li><a href="/article/1632.htm"
                                       title="【MongoDB学习笔记十一】Mongo副本集基本的增删查" target="_blank">【MongoDB学习笔记十一】Mongo副本集基本的增删查</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/mongodb/1.htm">mongodb</a>
                                    <div>一、创建复本集 
  
假设mongod,mongo已经配置在系统路径变量上,启动三个命令行窗口,分别执行如下命令: 
  
mongod --port 27017 --dbpath  data1 --replSet rs0

mongod --port 27018 --dbpath  data2 --replSet rs0

mongod --port 27019 -</div>
                                </li>
                                <li><a href="/article/1759.htm"
                                       title="Anychart图表系列二之执行Flash和HTML5渲染" target="_blank">Anychart图表系列二之执行Flash和HTML5渲染</a>
                                    <span class="text-muted">白糖_</span>
<a class="tag" taget="_blank" href="/search/Flash/1.htm">Flash</a>
                                    <div>今天介绍Anychart的Flash和HTML5渲染功能 
  
 
 HTML5 
 
Anychart从6.0第一个版本起,已经逐渐开始支持各种图的HTML5渲染效果了,也就是说即使你没有安装Flash插件,只要浏览器支持HTML5,也能看到Anychart的图形(不过这些是需要做一些配置的)。 
这里要提醒下大家,Anychart6.0版本对HTML5的支持还不算很成熟,目前还处于</div>
                                </li>
                                <li><a href="/article/1886.htm"
                                       title="Laravel版本更新异常4.2.8-> 4.2.9 Declaration of ... CompilerEngine ... should be compa" target="_blank">Laravel版本更新异常4.2.8-> 4.2.9 Declaration of ... CompilerEngine ... should be compa</a>
                                    <span class="text-muted">bozch</span>
<a class="tag" taget="_blank" href="/search/laravel/1.htm">laravel</a>
                                    <div>昨天在为了把laravel升级到最新的版本,突然之间就出现了如下错误: 
ErrorException thrown with message "Declaration of Illuminate\View\Engines\CompilerEngine::handleViewException() should be compatible with Illuminate\View\Eng</div>
                                </li>
                                <li><a href="/article/2013.htm"
                                       title="编程之美-NIM游戏分析-石头总数为奇数时如何保证先动手者必胜" target="_blank">编程之美-NIM游戏分析-石头总数为奇数时如何保证先动手者必胜</a>
                                    <span class="text-muted">bylijinnan</span>
<a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B%E4%B9%8B%E7%BE%8E/1.htm">编程之美</a>
                                    <div>


import java.util.Arrays;
import java.util.Random;

public class Nim {

	/**编程之美 NIM游戏分析
问题:
有N块石头和两个玩家A和B,玩家A先将石头随机分成若干堆,然后按照BABA...的顺序不断轮流取石头,
能将剩下的石头一次取光的玩家获胜,每次取石头时,每个玩家只能从若干堆石头中任选一堆,</div>
                                </li>
                                <li><a href="/article/2140.htm"
                                       title="lunce创建索引及简单查询" target="_blank">lunce创建索引及简单查询</a>
                                    <span class="text-muted">chengxuyuancsdn</span>
<a class="tag" taget="_blank" href="/search/%E6%9F%A5%E8%AF%A2/1.htm">查询</a><a class="tag" taget="_blank" href="/search/%E5%88%9B%E5%BB%BA%E7%B4%A2%E5%BC%95/1.htm">创建索引</a><a class="tag" taget="_blank" href="/search/lunce/1.htm">lunce</a>
                                    <div>import java.io.File;
import java.io.IOException;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Docume</div>
                                </li>
                                <li><a href="/article/2267.htm"
                                       title="[IT与投资]坚持独立自主的研究核心技术" target="_blank">[IT与投资]坚持独立自主的研究核心技术</a>
                                    <span class="text-muted">comsci</span>
<a class="tag" taget="_blank" href="/search/it/1.htm">it</a>
                                    <div> 
 
       和别人合作开发某项产品....如果互相之间的技术水平不同,那么这种合作很难进行,一般都会成为强者控制弱者的方法和手段..... 
 
 
       所以弱者,在遇到技术难题的时候,最好不要一开始就去寻求强者的帮助,因为在我们这颗星球上,生物都有一种控制其</div>
                                </li>
                                <li><a href="/article/2394.htm"
                                       title="flashback transaction闪回事务查询" target="_blank">flashback transaction闪回事务查询</a>
                                    <span class="text-muted">daizj</span>
<a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/%E9%97%AA%E5%9B%9E%E4%BA%8B%E5%8A%A1/1.htm">闪回事务</a>
                                    <div>   
闪回事务查询有别于闪回查询的特点有以下3个: 
 
(1)其正常工作不但需要利用撤销数据,还需要事先启用最小补充日志。 
 
(2)返回的结果不是以前的“旧”数据,而是能够将当前数据修改为以前的样子的撤销SQL(Undo SQL)语句。 
 
(3)集中地在名为flashback_transaction_query表上查询,而不是在各个表上通过“as of”或“vers</div>
                                </li>
                                <li><a href="/article/2521.htm"
                                       title="Java I/O之FilenameFilter类列举出指定路径下某个扩展名的文件" target="_blank">Java I/O之FilenameFilter类列举出指定路径下某个扩展名的文件</a>
                                    <span class="text-muted">游其是你</span>
<a class="tag" taget="_blank" href="/search/FilenameFilter/1.htm">FilenameFilter</a>
                                    <div>这是一个FilenameFilter类用法的例子,实现的列举出“c:\\folder“路径下所有以“.jpg”扩展名的文件。        1   2   3   4   5   6   7   8   9   10   11   12   13   14   15   16   17   18   19   20   21   22   23   24   25   26   27   28  </div>
                                </li>
                                <li><a href="/article/2648.htm"
                                       title="C语言学习五函数,函数的前置声明以及如何在软件开发中合理的设计函数来解决实际问题" target="_blank">C语言学习五函数,函数的前置声明以及如何在软件开发中合理的设计函数来解决实际问题</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/c/1.htm">c</a>
                                    <div># include <stdio.h>

int f(void)		//括号中的void表示该函数不能接受数据,int表示返回的类型为int类型
{
	return 10;	//向主调函数返回10
}

void g(void)	//函数名前面的void表示该函数没有返回值
{
	//return 10;	//error 与第8行行首的void相矛盾
}

in</div>
                                </li>
                                <li><a href="/article/2775.htm"
                                       title="今天在测试环境使用yum安装,遇到一个问题: Error: Cannot retrieve metalink for repository: epel. Pl" target="_blank">今天在测试环境使用yum安装,遇到一个问题: Error: Cannot retrieve metalink for repository: epel. Pl</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/centos/1.htm">centos</a>
                                    <div>今天在测试环境使用yum安装,遇到一个问题: 
Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again 
  
处理很简单,修改文件“/etc/yum.repos.d/epel.repo”, 将baseurl的注释取消, mirrorlist注释掉。即可。 
&n</div>
                                </li>
                                <li><a href="/article/2902.htm"
                                       title="单例模式" target="_blank">单例模式</a>
                                    <span class="text-muted">shuizhaosi888</span>
<a class="tag" taget="_blank" href="/search/%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F/1.htm">单例模式</a>
                                    <div>单例模式        懒汉式 
public class RunMain {

	/**
	 * 私有构造
	 */
	private RunMain() {
	}
	
    /**
     * 内部类,用于占位,只有
     */
	private static class SingletonRunMain {
		priv</div>
                                </li>
                                <li><a href="/article/3029.htm"
                                       title="Spring Security(09)——Filter" target="_blank">Spring Security(09)——Filter</a>
                                    <span class="text-muted">234390216</span>
<a class="tag" taget="_blank" href="/search/Spring+Security/1.htm">Spring Security</a>
                                    <div>Filter 
目录 
1.1     Filter顺序 
1.2     添加Filter到FilterChain 
1.3     DelegatingFilterProxy 
1.4     FilterChainProxy 
1.5</div>
                                </li>
                                <li><a href="/article/3156.htm"
                                       title="公司项目NODEJS实践0.1" target="_blank">公司项目NODEJS实践0.1</a>
                                    <span class="text-muted">逐行分析JS源代码</span>
<a class="tag" taget="_blank" href="/search/mongodb/1.htm">mongodb</a><a class="tag" taget="_blank" href="/search/nginx/1.htm">nginx</a><a class="tag" taget="_blank" href="/search/ubuntu/1.htm">ubuntu</a><a class="tag" taget="_blank" href="/search/nodejs/1.htm">nodejs</a>
                                    <div>  
一、前言 
        前端如何独立用nodeJs实现一个简单的注册、登录功能,是不是只用nodejs+sql就可以了?其实是可以实现,但离实际应用还有距离,那要怎么做才是实际可用的。 
        网上有很多nod</div>
                                </li>
                                <li><a href="/article/3283.htm"
                                       title="java.lang.Math" target="_blank">java.lang.Math</a>
                                    <span class="text-muted">liuhaibo_ljf</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/Math/1.htm">Math</a><a class="tag" taget="_blank" href="/search/lang/1.htm">lang</a>
                                    <div>System.out.println(Math.PI); 
System.out.println(Math.abs(1.2)); 
System.out.println(Math.abs(1.2)); 
System.out.println(Math.abs(1)); 
System.out.println(Math.abs(111111111)); 
System.out.println(Mat</div>
                                </li>
                                <li><a href="/article/3410.htm"
                                       title="linux下时间同步" target="_blank">linux下时间同步</a>
                                    <span class="text-muted">nonobaba</span>
<a class="tag" taget="_blank" href="/search/ntp/1.htm">ntp</a>
                                    <div>今天在linux下做hbase集群的时候,发现hmaster启动成功了,但是用hbase命令进入shell的时候报了一个错误  PleaseHoldException: Master is initializing,查看了日志,大致意思是说master和slave时间不同步,没办法,只好找一种手动同步一下,后来发现一共部署了10来台机器,手动同步偏差又比较大,所以还是从网上找现成的解决方</div>
                                </li>
                                <li><a href="/article/3537.htm"
                                       title="ZooKeeper3.4.6的集群部署" target="_blank">ZooKeeper3.4.6的集群部署</a>
                                    <span class="text-muted">roadrunners</span>
<a class="tag" taget="_blank" href="/search/zookeeper/1.htm">zookeeper</a><a class="tag" taget="_blank" href="/search/%E9%9B%86%E7%BE%A4/1.htm">集群</a><a class="tag" taget="_blank" href="/search/%E9%83%A8%E7%BD%B2/1.htm">部署</a>
                                    <div>ZooKeeper是Apache的一个开源项目,在分布式服务中应用比较广泛。它主要用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步、集群管理、配置文件管理、同步锁、队列等。这里主要讲集群中ZooKeeper的部署。 
  
1、准备工作 
我们准备3台机器做ZooKeeper集群,分别在3台机器上创建ZooKeeper需要的目录。 
  
数据存储目录</div>
                                </li>
                                <li><a href="/article/3664.htm"
                                       title="Java高效读取大文件" target="_blank">Java高效读取大文件</a>
                                    <span class="text-muted">tomcat_oracle</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                                    <div>  读取文件行的标准方式是在内存中读取,Guava 和Apache Commons IO都提供了如下所示快速读取文件行的方法:     Files.readLines(new File(path), Charsets.UTF_8);     FileUtils.readLines(new File(path));     这种方法带来的问题是文件的所有行都被存放在内存中,当文件足够大时很快就会导致</div>
                                </li>
                                <li><a href="/article/3791.htm"
                                       title="微信支付api返回的xml转换为Map的方法" target="_blank">微信支付api返回的xml转换为Map的方法</a>
                                    <span class="text-muted">xu3508620</span>
<a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a><a class="tag" taget="_blank" href="/search/map/1.htm">map</a><a class="tag" taget="_blank" href="/search/%E5%BE%AE%E4%BF%A1api/1.htm">微信api</a>
                                    <div>举例如下: 
<xml> 
   <return_code><![CDATA[SUCCESS]]></return_code> 
   <return_msg><![CDATA[OK]]></return_msg> 
   <appid><</div>
                                </li>
                </ul>
            </div>
        </div>
    </div>

<div>
    <div class="container">
        <div class="indexes">
            <strong>按字母分类:</strong>
            <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a
                href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a
                href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a
                href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a
                href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a
                href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a
                href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a
                href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a
                href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a>
        </div>
    </div>
</div>
<footer id="footer" class="mb30 mt30">
    <div class="container">
        <div class="footBglm">
            <a target="_blank" href="/">首页</a> -
            <a target="_blank" href="/custom/about.htm">关于我们</a> -
            <a target="_blank" href="/search/Java/1.htm">站内搜索</a> -
            <a target="_blank" href="/sitemap.txt">Sitemap</a> -
            <a target="_blank" href="/custom/delete.htm">侵权投诉</a>
        </div>
        <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved.
<!--            <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>-->
        </div>
    </div>
</footer>
<!-- 代码高亮 -->
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script>
<link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/>
<script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script>





</body>

</html>